在循环PL / SQL中执行Select并返回游标?

时间:2017-08-09 16:36:24

标签: sql oracle plsql oracle-sqldeveloper

对于谁知道PL / SQL,这可能是一个简单的问题。 我有一个存储过程,它在输入中获取一个varchar数组:

 BEGIN 
  FOR i IN SINGLE.first .. SINGLE.last
  LOOP
  --BEGIN OPEN P_RESULT FOR this --this on left gives me error
                                SELECT MT.DESCR INTO P_SOMETHING
                                FROM MYTABLE1 MT
                                WHERE MT.IDS = SINGLE(i)
                                AND and rownum < 2;
--dbms_output.put_line(SINGLE(i)); --if i use this instead of select i get the values i send to this procedure.
  END LOOP;

游标有效,因为我在其他情况下测试了它,但这是第一个带数组参数的。

我的身体有问题,如何将我从select中获得的每个值分配给光标?

SELECT MT.DESCR INTO P_RESULT but gives error

我也试过了:

{{1}}

我做错了什么? 谢谢你的建议。

1 个答案:

答案 0 :(得分:0)

您无法在11g的SQL语句中使用PL / SQL集合类型。您可以创建一个SQL集合类型,或者找到一个您已有权访问的类型(具有合适的字符串长度)并使用它来至少验证该机制。

例如,这使用类型为SYS.HSBLKNAMLST的局部变量,其定义为table of varchar2(30),足以匹配您自己的PL / SQL类型的字符串长度。该变量从传入的PL / SQL类型填充,然后在查询中用于打开游标:

PROCEDURE MYPROC(
  SINGLE                                IN     MULTI,
  P_RESULT                              OUT    MY_PCK.MYCURSOR
) IS
  LOCAL_COLL SYS.HSBLKNAMLST := SYS.HSBLKNAMLST();
BEGIN 
  FOR i IN SINGLE.first .. SINGLE.last
  LOOP
    LOCAL_COLL.extend();
    LOCAL_COLL(LOCAL_COLL.last) := SINGLE(i);
  END LOOP;

  OPEN P_RESULT FOR
    SELECT MT.DESCR
    FROM MYTABLE1 MT
    LEFT JOIN TABLE(LOCAL_COLL) LC
    ON LC.COLUMN_VALUE = MT.IDS
    WHERE LC.COLUMN_VALUE IS NULL;

END;

我对您在循环中显示的查询感到有点困惑;你似乎试图为数组的每个元素重新打开游标,尽管你可能试图将每个元素的查询结果附加到同一个游标 - 认为!=意味着所有行会被包含在某个时刻。我猜你是在试图获取所有不在数组中的IDS值的记录。如果你真的想要所有那些,那就是:

  OPEN P_RESULT FOR
    SELECT MT.DESCR
    FROM TABLE(LOCAL_COLL) LC
    JOIN MYTABLE1 MT
    ON MT.IDS = LC.COLUMN_VALUE;

您可以通过查询数据字典来查看可用的内置类型,例如:

select owner, type_name, coll_type, elem_type_name, length
from all_coll_types
where elem_type_name = 'VARCHAR2'
and coll_type = 'TABLE'
and owner = 'SYS'
order by length;

如果您能够创建自己的SQL类型,最好是