PL / SQL'选择..在...中使用本地表集合

时间:2014-09-01 06:13:19

标签: oracle collections plsql types

我使用的是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语句中不允许使用本地集合类型

如何解决这个问题?

1 个答案:

答案 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.