当前位置: 首页 > 面试题库 >

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

衡安晏
2023-03-14
问题内容

我在接收几个参数的过程中使用一个简单的游标。然后,我在带有带多个条件的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语句引用的名称既属于列又属于局部变量或形式参数,则该列名称优先。

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

前四项检查始终为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';


 类似资料:
  • 问题内容: 在Oracle中,可以使用关键字返回SQL查询内部的内容,如下所示: 问题是: 有谁知道我在哪里可以找到相关文档? PortgreSQL(或任何其他开源DBMS)是否具有类似的功能? 问题答案: 它被称为CURSOR EXPRESSION,并在明显的地方记录了该文档:《 Oracle SQL参考》。 在这里找到它。 关于第二个问题,PostgreSQL提供的与此功能最接近的东西是“标量

  • 问题内容: 我正在写一个跨三个表的JPQL查询。在我的结果列表中,我想获得每个匹配行的所有三个实体(希望如此)。 有任何想法吗? Hibernate 3.x是我的JPA提供程序。 问题答案: IIRC,您可以执行,结果将是,其中数组内容将包含o1,o2,o3值。

  • 有人真的很快就否决了我的问题,因为它缺乏足够的信息。然后我编辑了它,但反对票仍然是:(

  • 问题内容: 如何在同一例程中使用两个游标?如果我删除了第二个游标声明并获取了循环,一切都将正常工作。该例程用于在我的webapp中添加朋友。它使用当前用户的ID和我们要添加的朋友的电子邮件作为朋友,然后检查电子邮件是否具有相应的用户ID,如果不存在朋友关系,它将创建一个。除此以外的任何其他常规解决方案也都很好。 问题答案: 我终于写了一个执行相同功能的不同函数: 我希望这是一个更好的解决方案,无论

  • 问题内容: 桌子: 我的查询: 我收到“ MySQL子查询返回多个行”错误。 我知道此查询可以使用以下查询的解决方法: 然后使用php循环遍历结果并执行以下查询以获取和回显它: 但是我认为可能会有更好的解决方案? 问题答案: 简单的解决方法是在子查询中添加一个子句: 一个更好的选择(就性能而言)是使用联接:

  • 问题内容: 我正在执行此查询: 我正在尝试使其返回如下内容: 但是,我得到了错误: #1242-子查询返回的行数超过1。 我尝试将语句放置在子查询中,但是收到无效的语法错误。 问题答案: 您可以使用简单的分组方式在没有子查询的情况下进行尝试: 使用GROUP BY时,未分组的任何列都必须具有聚合子句(fe SUM或COUNT。)因此,在这种情况下,您必须对县名称,precienct.id和prec