【问题标题】:Pl/Sql Open Cursor inside for loopPl/Sql 在for循环中打开游标
【发布时间】: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 语句结合起来,而不是在一个步骤中填充集合并在后续步骤的查询中使用它。

标签: oracle plsql


【解决方案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))"
猜你喜欢
  • 1970-01-01
  • 2012-03-27
  • 2012-04-28
  • 2021-07-30
  • 1970-01-01
  • 2023-04-01
  • 2022-10-13
  • 1970-01-01
  • 2012-11-05
相关资源
最近更新 更多