Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行游标时PLSQL FOR循环_Plsql_Cursor - Fatal编程技术网

执行游标时PLSQL FOR循环

执行游标时PLSQL FOR循环,plsql,cursor,Plsql,Cursor,我想知道在对游标执行SELECT值时是否有迭代表的选项 例如: 我有一个只包含数字的表TEMP_NUMBERS(单列)。 我必须从表中的每个数字中进行选择(我事先不知道表中的行数) 这就是我想要做的。显然这不起作用,但我能做些变通吗? 我需要将数据选择到p_cv_PermsNotifs中,这是一个返回参考光标 IF NOT p_cv_PermsNotifs%ISOPEN THEN OPEN p_cv_PermsNotifs FOR FOR i IN 1..TEMP_NUMBERS.NUMBER

我想知道在对游标执行SELECT值时是否有迭代表的选项

例如: 我有一个只包含数字的表TEMP_NUMBERS(单列)。 我必须从表中的每个数字中进行选择(我事先不知道表中的行数)

这就是我想要做的。显然这不起作用,但我能做些变通吗? 我需要将数据选择到p_cv_PermsNotifs中,这是一个返回参考光标

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是由二进制整数索引的数字表。 但是我得到了“ORA-22905:无法从非嵌套表项访问行”


提前感谢。

在>嘿,如果您一次只传递一个数字,那么每次都会使用refcursor

将被下一个值覆盖。所以最后你只会得到 参照光标中最后一个数字的值。更好的方法是使用 一些基本的PL/SQL批量收集逻辑将为您提供所需的 输出。 希望这有帮助


尝试了此解决方案,但我发现:ora-22905无法访问非嵌套表项中的行尝试此操作我添加了一个强制转换函数以确保不会出现此错误。是否可以将保存数字的临时表连接到sec_user_role表?
    --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;