Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Cursor in Prozedur, der mehr Werte als Abfrage zurückgibt

Sie haben einen Namenskonflikt. Sie haben Ihre lokalen Variablen genauso benannt wie Ihre Spaltennamen, und die Spaltennamen haben Vorrang, wie in der Dokumentation angegeben:

Wenn eine SQL-Anweisung auf einen Namen verweist, der sowohl zu einer Spalte als auch zu einer lokalen Variablen oder einem formalen Parameter gehört, dann hat der Spaltenname Vorrang.

Achtung:
Wenn ein Variablen- oder Parametername als Spaltenname interpretiert wird, können Daten versehentlich gelöscht, geändert oder eingefügt werden.

Die ersten vier Prüfungen werden immer wahr sein (es sei denn, Sie haben Nullwerte), sodass Sie jede Zeile erhalten, die done = 'N' hat .

Ändern Sie Ihre lokalen Variablennamen in etwas anderes; Es ist ziemlich üblich, ein Präfix zu verwenden, um zwischen lokalen Variablen, Parametern und Spalten zu unterscheiden, etwa so:

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

Wenn es sich um eine gespeicherte Prozedur und nicht um einen anonymen Block handelt, könnten Sie den Prozedur-/Funktionsnamen als Präfix verwenden, was manche Leute bevorzugen. Wenn Ihre Prozedur myproc hieß , zum Beispiel könnten Sie Folgendes tun:

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