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