【问题标题】:Using Table type in IN-clause in PLSQL procedure在 PLSQL 过程的 IN 子句中使用表类型
【发布时间】:2012-12-03 20:39:43
【问题描述】:

我有一个采用表格类型输入参数的过程。现在我必须在 SELECT 查询的 IN 子句中使用这个参数。

CREATE TYPE ids IS TABLE OF NUMBER;

CREATE PROCEDURE (emp_ids IN ids) IS

CURSOR IS (SELECT * FROM EMPLOYEES WHERE EMP_ID IN (SELECT * FROM TABLE(emp_ids)); .....

但我发现这段代码行不通,因为本地集合类型不能在 SQL 语句中使用。

有没有其他方法可以在 SELECT 语句中使用表类型参数?

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    根据您发布的内容,您将集合声明为模式对象,而不是本地类型。这意味着您在使用它时不应该有任何问题。这是一个例子:

    -- collection type as schema object
    SQL> create or replace type ids is table of number;
      2  /
    
    Type created
    
    SQL> create or replace procedure proc1 (emp_ids IN ids)
      2  IS
      3     cursor c is (
      4       select first_name
      5         from employees
      6        where employee_id in (select column_value
      7                                from table(emp_ids)
      8                              )
      9     );
     10  begin
     11    for i in c
     12    loop
     13       dbms_output.put_line(i.first_name);
     14    end loop;
     15  end;
     16  /
    
    Procedure created
    
    SQL> exec proc1(ids(101, 103, 200));
    
    Neena
    Alexander
    Jennifer
    
    PL/SQL procedure successfully completed
    

    【讨论】:

    • 感谢您的快速回复。但是,当我在包中声明集合对象并在 SELECT 查询中使用它时,我遇到了“本地集合类型不能在 SQL 语句中使用”错误。有没有其他方法可以在包级别使用它?
    • @AbdulMubeen 不幸的是,您不能在 sql 语句中使用 pl/sql 类型(无论该类型是在存储过程中还是包体\规范中声明),并且消息非常清楚地说明了这一点。所以你的选择是创建一个sql类型。
    猜你喜欢
    • 2013-03-09
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多