PL / SQL использовать переменную таблицы в предложении Where - PullRequest
1 голос
/ 29 декабря 2011

У меня есть табличная переменная, которая передается в процедуру.Я хотел бы использовать значения в предложении where, как показано ниже, как мне это сделать.Первая строка ниже объявлена ​​в определении пакета.Процедура ниже находится в теле пакета.

type CatalogNos is table of VARCHAR2(100);
PROCEDURE GET_PART_CHARACTERISTICS (v_catalog_nos_  IN CatalogNos, 
                                    Parts_Char_Cursor out sys_refcursor) AS
BEGIN
    OPEN Parts_Char_Cursor FOR
    SELECT * FROM IFSAPP.SALES_PART_CHARACTERISTIC
    WHERE CATALOG_NO IN (select values from v_catalog_nos_);
END GET_PART_CHARACTERISTICS;

Ответы [ 3 ]

5 голосов
/ 29 декабря 2011

Является ли CatalogNos типом SQL (т. Е. Не объявлено в спецификации пакета)? Если так:

PROCEDURE GET_PART_CHARACTERISTICS (v_catalog_nos_  IN CatalogNos, 
                                    Parts_Char_Cursor out sys_refcursor) 
AS
BEGIN
    OPEN Parts_Char_Cursor FOR
    SELECT * FROM IFSAPP.SALES_PART_CHARACTERISTIC
    WHERE CATALOG_NO IN (select * from table(v_catalog_nos_));
END GET_PART_CHARACTERISTICS;

"Этот SQL выдает ошибку: PLS-00642: локальные типы коллекций не разрешено в операторах SQL "

То есть CatalogNos - это не тип SQL, т. Е. Это тип PL / SQL, объявленный в спецификации или теле пакета. Сообщение об ошибке совершенно ясно: мы не можем использовать типы PL / SQL в инструкциях SQL. Так оно и есть.

Самое простое решение - использовать тип SQL.

SQL> create or replace type CatalogNos is table of VARCHAR2(100);    
  2  /

Type created.

SQL> 

Если вы действительно не хотите создавать свой собственный тип (почему бы и нет?), Вы можете использовать одну из встроенных функций Oracle. Как это:

create or replace PROCEDURE GET_PART_CHARACTERISTICS
      (v_catalog_nos_  IN sys.dbms_debug_vc2coll,
       Parts_Char_Cursor out sys_refcursor)
AS
BEGIN
    OPEN Parts_Char_Cursor FOR
    SELECT * FROM IFSAPP.SALES_PART_CHARACTERISTIC
    WHERE CATALOG_NO IN (select * from table(v_catalog_nos_));
END GET_PART_CHARACTERISTICS;
/
2 голосов
/ 29 декабря 2011
create type CatalogNos is table of VARCHAR2(100);

CREATE OR REPLACE PACKAGE your_package as
   PROCEDURE GET_PART_CHARACTERISTICS (v_catalog_nos_  IN CatalogNos, 
                                       Parts_Char_Cursor out sys_refcursor);
END your_package;

CREATE OR REPLACE PACKAGE BODY your_package as
   PROCEDURE GET_PART_CHARACTERISTICS (v_catalog_nos_  IN CatalogNos, 
                                       Parts_Char_Cursor out sys_refcursor) AS
   BEGIN
       OPEN Parts_Char_Cursor FOR
       SELECT * FROM IFSAPP.SALES_PART_CHARACTERISTIC
       WHERE CATALOG_NO IN (select column_value from table(v_catalog_nos_));
   END GET_PART_CHARACTERISTICS;
END your_package;

Определение типа должно быть объектом базы данных, а не частью пакета, для использования в SQL.Как только это правда, вы можете использовать функцию table для ссылки на переменную этого типа в предложении from.


Исходя из комментария, кажется, что мне нужно повторить:чтобы ссылаться на пользовательский тип данных в SQL, вы должны определить тип как отдельный объект вне пакета.


Для пользовательской таблицы, содержащей одно безымянное поле, вы можетеиспользуйте select * или select column_value.

0 голосов
/ 29 декабря 2011

Использование ||для конкатенации вашего запроса с переменной

что-то вроде:

type CatalogNos is table of VARCHAR2(100);
PROCEDURE GET_PART_CHARACTERISTICS (v_catalog_nos_  IN CatalogNos, 
                                Parts_Char_Cursor out sys_refcursor) AS
BEGIN
   OPEN Parts_Char_Cursor FOR
   'SELECT * FROM IFSAPP.SALES_PART_CHARACTERISTIC
   WHERE CATALOG_NO IN (select values from' || v_catalog_nos_ || ')';
END GET_PART_CHARACTERISTICS;
...