执行CURSOR时PLSQL FOR循环

时间:2015-12-31 09:29:22

标签: plsql cursor

我想知道是否有任何选项在将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:无法访问非嵌套表格项目中的行"

提前致谢。

1 个答案:

答案 0 :(得分:0)

在>嘿,如果你一次传递一个数字,每次都是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;