Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Cursor no procedimento retornando mais valores que a consulta


Você tem um conflito de nomes. Você chamou suas variáveis ​​locais da mesma forma que seus nomes de coluna, e os nomes de coluna estão tendo precedência, conforme observado na documentação:

Se uma instrução SQL fizer referência a um nome que pertença a uma coluna e a uma variável local ou a um parâmetro formal, o nome da coluna terá precedência.

Cuidado:
Quando um nome de variável ou parâmetro é interpretado como um nome de coluna, os dados podem ser excluídos, alterados ou inseridos involuntariamente.

As primeiras quatro verificações sempre serão verdadeiras (a menos que você tenha valores nulos), então você obterá todas as linhas que done = 'N' .

Altere seus nomes de variáveis ​​locais para outra coisa; é bastante comum usar um prefixo para distinguir entre variáveis ​​locais, parâmetros e colunas, 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';

Se estiver em um procedimento armazenado, em vez de um bloco anônimo, você pode usar o nome do procedimento/função como um prefixo, o que algumas pessoas preferem. Se seu procedimento foi chamado myproc , por exemplo, você poderia fazer:
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';