sql >> Base de Datos >  >> RDS >> Oracle

Cursor en el procedimiento que devuelve más valores que la consulta

Tienes un conflicto de nombres. Ha llamado a sus variables locales de la misma manera que los nombres de sus columnas, y los nombres de las columnas tienen prioridad, como se indica en la documentación:

Si una instrucción SQL hace referencia a un nombre que pertenece tanto a una columna como a una variable local o un parámetro formal, entonces el nombre de la columna tiene prioridad.

Precaución:
Cuando el nombre de una variable o parámetro se interpreta como un nombre de columna, los datos se pueden eliminar, cambiar o insertar sin querer.

Las primeras cuatro comprobaciones siempre serán verdaderas (a menos que tenga valores nulos), por lo que obtendrá cada fila que tenga done = 'N' .

Cambie los nombres de sus variables locales a otra cosa; es bastante común usar un prefijo para distinguir entre variables locales, parámetros y columnas, algo como:

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

Si esto está en un procedimiento almacenado, en lugar de un bloque anónimo, puede usar el nombre del procedimiento/función como prefijo, lo que algunas personas prefieren. Si su procedimiento se llamó myproc , por ejemplo, podrías hacer:

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