2009-12-07 60 views
3

我想要做在Oracle 10g中以下(这是一个人为的例子来显示的概念,而不是真正的代码)甲骨文嵌套表名和列名

create table orders (order_id NUMBER); 
    insert into table orders values (1); 
    insert into table orders values (2); 
    insert into table orders values (3); 


TYPE NUMBER_ARRAY_T is TABLE of NUMBER; 

PROCEDURE VALIDATE_ORDER_IDS(i_orders IN NUMBER_ARRAY_T, o_output OUT SYS_REFCURSOR)  
IS  
BEGIN 
    OPEN o_output FOR 
     select ??? from TABLE(i_orders) where ??? NOT IN (select order_id from orders); 
END VALIDATE_ORDER_IDS; 

存储的过程将与一个被称为包含(1,2)的数组,并且我们期望得到3回来作为结果

所以,问题是,是否有指定列名称?在使用嵌套表作为表时,所以上面的select语句可以工作吗?

回答

4

您正在寻找的关键字是column_value。有了您的设置:

SQL> CREATE OR REPLACE TYPE NUMBER_ARRAY_T is TABLE of NUMBER; 
    2/

Type created 
SQL> CREATE OR REPLACE PROCEDURE validate_order_ids(i_orders IN number_array_t, 
    2             o_output OUT SYS_REFCURSOR) 
    3 IS BEGIN 
    4  OPEN o_output FOR 
    5   SELECT COLUMN_VALUE 
    6   FROM TABLE(i_orders) 
    7   WHERE COLUMN_VALUE NOT IN (SELECT order_id FROM orders); 
    8 END validate_order_ids; 
    9/

Procedure created 

要调用只需将程序:

SQL> VARIABLE x REFCURSOR 
SQL> exec validate_order_ids(number_array_t(1,5), :x); 

ProcÚdure PL/SQL terminÚe avec succÞs. 

SQL> print x 

COLUMN_VALUE 
------------ 
      5 
+0

完美!谢谢 - 我现在在使用集合文档中看到了这一点,但它并未完全突出显示,所以我正确地阅读它 - 感谢您的帮助。 – wadesworld 2009-12-07 18:26:49