sql >> Database >  >> RDS >> Oracle

Cursor in procedure die meer waarden retourneert dan query

Je hebt een naamconflict. U hebt uw lokale variabelen op dezelfde manier aangeroepen als uw kolomnamen, en de kolomnamen hebben voorrang, zoals vermeld in de documentatie:

Als een SQL-instructie verwijst naar een naam die zowel bij een kolom als bij een lokale variabele of formele parameter hoort, heeft de kolomnaam voorrang.

Let op:
Als een variabele of parameternaam wordt geïnterpreteerd als een kolomnaam, kunnen gegevens onbedoeld worden verwijderd, gewijzigd of ingevoegd.

De eerste vier controles zullen altijd waar zijn (tenzij je null-waarden hebt), dus je krijgt elke rij die done = 'N' heeft .

Verander uw lokale variabelenamen in iets anders; het is vrij gebruikelijk om een ​​voorvoegsel te gebruiken om onderscheid te maken tussen lokale variabelen, parameters en kolommen, zoiets als:

Cursor linija IS 
SELECT *
FROM table_x X
where x.mjt = l_mjt
and   x.salesman = l_salesman
and x.kind = l_kind
and x.kolo1 = l_kolo1
and x.done = 'N';

Als dit in een opgeslagen procedure is, in plaats van in een anoniem blok, zou je de procedure/functienaam als voorvoegsel kunnen gebruiken, waar sommige mensen de voorkeur aan geven. Als uw procedure myproc heette , u kunt bijvoorbeeld het volgende doen:

Cursor linija IS 
SELECT *
FROM table_x X
where x.mjt = myproc.mjt
and   x.salesman = myproc.salesman
and x.kind = myproc.kind
and x.kolo1 = myproc.kolo1
and x.done = 'N';


  1. Fix "ERROR 1222 (21000):de gebruikte SELECT-instructies hebben een ander aantal kolommen" bij gebruik van UNION in MySQL

  2. Voorbeeld van een eenvoudige samenvoeginstructie in SQL Server

  3. Een dynamisch gegenereerde draaitabel in een tijdelijke tabel krijgen

  4. Hoe maak ik een externe sleutel in SQL Server?