一尘不染

过程中的游标返回比查询更多的值

sql

我在接收几个参数的过程中使用一个简单的游标。然后,我在带有带多个条件的where子句的select查询上做一个游标,这些条件等于接收到的参数。该游标应该只返回1行,而是返回多行。我发现这是因为我使用了一个for循环来遍历此游标,然后根据该游标的值将内容插入到另一个表中。

当我在数据库上静态运行查询时(如不使用pl /
sql一样),可以得到期望的结果,但是当我从游标执行查询时,该游标应仅返回一行,并在for循环中运行,该循环执行多个迭代。这怎么可能?

谢谢!

编辑:

ID kind kolo kolo1 mjt salesman money   date       done
1  001  001  002   00013 00056  100,00  21-feb-12  N

我这样运行游标:

Cursor linija IS 
SELECT *
FROM table_x X

where x.mjt = mjt
and   x.salesman = salesman
and x.kind = kind
and x.kolo1 = kolo1
and x.done = 'N';

这应该只返回一行,但是我的光标返回的%rowcount是10。


阅读 126

收藏
2021-05-05

共1个答案

一尘不染

您有名称冲突。你已经叫你的局部变量相同,列名,列名正在采取优先地位,因为注意到在文件中

如果SQL语句引用的名称既属于列又属于局部变量或形式参数,则该列名称优先。

警告:
将变量或参数名称解​​释为列名称时,可能会意外删除,更改或插入数据。

前四项检查始终为true(除非您具有null值),因此您将获得具有的每一行done = 'N'

将本地变量名称更改为其他名称;使用前缀来区分局部变量,参数和列是相当普遍的,例如:

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

如果这是在存储过程中,而不是在匿名块中,则可以将过程/函数名用作前缀,某些人喜欢此前缀。myproc例如,如果您的过程被调用,则可以执行以下操作:

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