执行 CURSOR 时的 PLSQL FOR 循环

Posted

技术标签:

【中文标题】执行 CURSOR 时的 PLSQL FOR 循环【英文标题】:PLSQL FOR loop while executing CURSOR 【发布时间】:2015-12-31 09:29:21 【问题描述】:

我想知道在执行 SELECT 值到 CURSOR 时是否有任何选项可以迭代表。

例如: 我有一个表 TEMP_NUMBERS 只包含数字(单列)。 我必须对表中的每个数字执行一次 SELECT(我事先不知道表中的行数)。

这基本上是我想要做的。显然这不起作用,但我可以做一些解决方法吗? 我需要将数据选择到 p_cv_PermsNotifs 中,这是一个 RETURN REF CURSOR。

IF NOT p_cv_PermsNotifs%ISOPEN THEN OPEN p_cv_PermsNotifs FOR

FOR i IN 1..TEMP_NUMBERS.NUMBER.COUNT LOOP
SELECT DISTINCT
    SEC_USER_ROLE.ENTITY_TYP_CODE,
    SEC_USER_ROLE.ENTITY_ID
FROM
    SEC_USER_ROLE
WHERE
    SEC_USER_ROLE.ENTITY_ID = i
END LOOP;

END IF;

也试过这个:

IF NOT p_cv_PermsNotifs%ISOPEN THEN OPEN p_cv_PermsNotifs FOR

SELECT DISTINCT
    SEC_USER_ROLE.ENTITY_TYP_CODE,
    SEC_USER_ROLE.ENTITY_ID
FROM
    SEC_USER_ROLE
WHERE
    SEC_USER_ROLE.ENTITY_ID IN
  (SELECT * FROM TABLE (lv_ListOfEntities))

END IF;

其中 lv_ListOfEntities 是由 BINARY INTEGER 索引的 NUMBER 表。 但我收到“ORA-22905:无法访问非嵌套表项中的行”

提前致谢。

【问题讨论】:

是否可以将保存数字的临时表加入到 sec_user_role 表中? 【参考方案1】:

In>嘿,如果你一次只传递一个数字,每次都是 refcursor

将被下一个值覆盖。所以最后你只会得到 refcursor 中最后一个数字的值。更好的方法是使用 一些基本的 PL/SQL Bulk COLLECT 逻辑,它将为您提供所需的 输出。 希望这会有所帮助

    --Creating sql type
CREATE OR REPLACE TYPE lv_num_tab IS TABLE OF NUMBER;
--plsql block
var p_lst refcursor;
DECLARE
  lv_num lv_num_tab;
BEGIN
  SELECT COL1 BULK COLLECT INTO lv_num FROM TEMP_NUMBERS;
  OPEN p_lst FOR
  SELECT DISTINCT SEC_USER_ROLE.ENTITY_TYP_CODE,
    SEC_USER_ROLE.ENTITY_ID
  FROM SEC_USER_ROLE
  WHERE SEC_USER_ROLE.ENTITY_ID IN
    (SELECT * FROM TABLE(cast(lv_num as lv_num_tab))
    );
END;

【讨论】:

试过这个解决方案,但我得到:ora-22905 无法访问非嵌套表项中的行 试试这个我添加了一个强制转换函数只是为了确保我们不会收到这个错误。

以上是关于执行 CURSOR 时的 PLSQL FOR 循环的主要内容,如果未能解决你的问题,请参考以下文章

Oracle/PLSQL CURSOR FOR Loop

Oracle/PLSQL 在 BULK COLLECT 之后处理 for LOOP 中的所有数据

为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?

Oracle存储过程游标for循环怎么写

如何在SQL 2005中实现循环每一行做一定的操作

PLSQL中的批量插入而不是循环?