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循环中打开游标的主要内容,如果未能解决你的问题,请参考以下文章

使用 FETCH 的 PL/SQL 游标 FOR 循环

pl / sql如何使用带有游标的for循环进行更新操作

如何在 PL/SQL 代码的 for 循环中创建游标并将结果批量收集到表中

pl sql select * from owner.view1 减去 select * from owner2.view1 作为 for 循环中的游标

PL/SQL 中的 for 循环和列

PL/SQL控制语句(循环控制语句)