对于谁知道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}}
我做错了什么? 谢谢你的建议。
答案 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类型,最好是