我使用的是Oracle 11,而且这段代码似乎无法运行:
procedure test()
as
type StrTable is table of number;
--local variable
testTable StrTable;
begin
testTable := StrTable();
--add values
testTable.extend(3);
testTable(1) := 111;
testTable(2) := 222;
testTable(3) := 333;
--query
select *
from users
where id in testTable; <---------------- ERROR!
end;
错误显示为:
错误(427,31):PLS-00642:SQL语句中不允许使用本地集合类型
如何解决这个问题?
答案 0 :(得分:4)
最简单的选择是在SQL中而不是在PL / SQL中定义集合。您的程序正在执行SELECT
,该数据不会将数据返回到本地变量中,并且不会用于打开游标 - 不管您是否已经不允许这样做使用集合与否。在我的示例中,我将COUNT(*)
添加到局部变量中 - 您可能想要执行其他操作。
-- Calling it StrTable when it's a table of numbers seems odd
CREATE TYPE StrTable
IS TABLE OF NUMBER;
CREATE PROCEDURE test
AS
testTable StrTable;
l_cnt pls_integer;
BEGIN
testTable := StrTable();
--add values
testTable.extend(3);
testTable(1) := 111;
testTable(2) := 222;
testTable(3) := 333;
-- query
SELECT COUNT(*)
INTO l_cnt
FROM users
WHERE id IN (SELECT column_value
FROM TABLE( testTable ));
dbms_output.put_line( l_cnt );
END;
只是为了证明它有效
SQL> exec test;
3
PL/SQL procedure successfully completed.