Pl/Sql 在for循环中打开游标
Posted
技术标签:
【中文标题】Pl/Sql 在for循环中打开游标【英文标题】:Pl/Sql Open Cursor inside for loop 【发布时间】:2020-02-05 20:42:35 【问题描述】:我在 Oracle Pl/Sql 中创建一个存储过程,首先我必须创建一个二维数组,其中记录的 ID 与特定条件匹配,我已经这样做了,接下来我必须通过特定表进行查询并获取我的“最终数组”的 ID 数据。
这是我循环遍历最终数组并查询表的 SP 部分。
FOR x IN array_final.FIRST .. array_final.LAST
LOOP
OPEN voCursor FOR
SELECT ID AS IDTRX FROM TBL_TRANSACTION WHERE ID in (array_final(x)(1));
dbms_output.Put_line(x);
totReg := x;
END LOOP;
问题是,光标只获取最后一条记录。
这是我从结果集获取结果的 Java 代码。
这就是控制台显示的内容,它说 2 条记录,但只显示一个 ID,最后一个
如何将 2 条记录放入 for 循环内的游标中?有没有更好的方法来做到这一点?
欢迎任何帮助,问候
【问题讨论】:
在循环中打开游标而不用它做任何事情是没有意义的。每次打开游标时,您都会丢弃先前的查询。假设voCursor
是过程中的out
参数,调用者将只能从用于打开游标的最后一个查询中获取数据。我猜这就是您所看到的,假设您的 Java 代码中的 totReg
以某种方式从 PL/SQL 代码中的 totReg
填充。
voCursor 是一个输出参数,这正是我面临的问题,我需要光标中的所有数据,我该怎么做?
array_final
是如何声明的?它是 SQL 类型还是 PL/SQL 类型?它是如何填充的?最简单的选择是采用填充该集合的任何查询并将其与SELECT
语句结合起来,而不是在一个步骤中填充集合并在后续步骤的查询中使用它。
【参考方案1】:
为什么是光标?我会声明一个变量
l_idtrx remove.id%type;
删除
OPEN voCursor FOR
只是
SELECT ID into l_idtrx FROM remove ...
[编辑:refcursor it is]
这里有一个简单的例子来说明你可能会如何做。由于您已经完成了大部分工作,因此请应用您缺少的部分。
SQL> create or replace function f_test
2 return sys_refcursor
3 is
4 l_rc sys_refcursor;
5 l_arr sys.odcinumberlist := sys.odcinumberlist(10, 20, 30);
6 begin
7 open l_rc for
8 select deptno, dname, loc
9 from dept join table(l_arr) on deptno = column_value;
10 return l_rc;
11 end;
12 /
Function created.
SQL> select f_test from dual;
F_TEST
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
SQL>
【讨论】:
我会试试的,但是有一个问题,必须要有一个游标作为 OUT 参数,有没有办法用游标做到这一点?? 我猜应该是 refcursor,而不是 cursor。 voCursor 是 refCursor 类型 就像我说的那样。我在答案中添加了更多代码;请看一下。 谢谢,这对我帮助很大,我所做的是创建一种带有 id 的数值数组,因此我不必循环,在选择中我使用“其中 id 在(从表中选择 id(array_ids))"以上是关于Pl/Sql 在for循环中打开游标的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PL/SQL 代码的 for 循环中创建游标并将结果批量收集到表中
pl sql select * from owner.view1 减去 select * from owner2.view1 作为 for 循环中的游标