Oracle
 sql >> Database >  >> RDS >> Oracle

Cursore nella procedura che restituisce più valori della query

Hai un conflitto di nomi. Hai chiamato le tue variabili locali come i nomi delle colonne e i nomi delle colonne hanno la precedenza, come indicato nella documentazione:

Se un'istruzione SQL fa riferimento a un nome che appartiene sia a una colonna che a una variabile locale oa un parametro formale, il nome della colonna ha la precedenza.

Attenzione:
Quando il nome di una variabile o di un parametro viene interpretato come un nome di colonna, i dati possono essere eliminati, modificati o inseriti involontariamente.

I primi quattro controlli saranno sempre veri (a meno che tu non abbia valori null), quindi otterrai ogni riga che ha done = 'N' .

Cambia i nomi delle tue variabili locali in qualcos'altro; è abbastanza comune usare un prefisso per distinguere tra variabili locali, parametri e colonne, qualcosa come:

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';

Se si trova in una procedura memorizzata, anziché in un blocco anonimo, è possibile utilizzare il nome della procedura/funzione come prefisso, cosa che alcune persone preferiscono. Se la tua procedura è stata chiamata myproc , ad esempio, potresti fare:

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';