Oracle
 sql >> Base de données >  >> RDS >> Oracle

Curseur dans la procédure renvoyant plus de valeurs que la requête

Vous avez un conflit de nom. Vous avez appelé vos variables locales de la même manière que vos noms de colonne, et les noms de colonne ont priorité, comme indiqué dans la documentation :

Si une instruction SQL fait référence à un nom qui appartient à la fois à une colonne et à une variable locale ou à un paramètre formel, le nom de la colonne est prioritaire.

Attention :
Lorsqu'un nom de variable ou de paramètre est interprété comme un nom de colonne, des données peuvent être supprimées, modifiées ou insérées involontairement.

Les quatre premières vérifications seront toujours vraies (sauf si vous avez des valeurs nulles), vous obtiendrez donc chaque ligne contenant done = 'N' .

Remplacez vos noms de variables locales par autre chose ; il est assez courant d'utiliser un préfixe pour distinguer les variables locales, les paramètres et les colonnes, quelque chose comme :

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

S'il s'agit d'une procédure stockée, plutôt que d'un bloc anonyme, vous pouvez utiliser le nom de la procédure/fonction comme préfixe, ce que certaines personnes préfèrent. Si votre procédure s'appelait myproc , par exemple, vous pourriez faire :

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