Oracle вложенные таблицы и имена столбцов - PullRequest
3 голосов
/ 07 декабря 2009

Я хотел бы сделать следующее в 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 обратно

Итак, вопрос в том, можно ли в любом случае указать имя столбца, где ??? находятся ли при использовании вложенной таблицы в качестве таблицы, чтобы вышеприведенный оператор выбора работал?

1 Ответ

4 голосов
/ 07 декабря 2009

Ключевое слово, которое вы ищете: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...