我在接收几个参数的过程中使用一个简单的游标。然后,我在带有带多个条件的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。
您有名称冲突。你已经叫你的局部变量相同,列名,列名正在采取优先地位,因为注意到在文件中:
如果SQL语句引用的名称既属于列又属于局部变量或形式参数,则该列名称优先。 警告: 将变量或参数名称解释为列名称时,可能会意外删除,更改或插入数据。
如果SQL语句引用的名称既属于列又属于局部变量或形式参数,则该列名称优先。
警告: 将变量或参数名称解释为列名称时,可能会意外删除,更改或插入数据。
前四项检查始终为true(除非您具有null值),因此您将获得具有的每一行done = 'N'。
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例如,如果您的过程被调用,则可以执行以下操作:
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';