Oracle Associative Array TYPE нельзя использовать в инструкции USING (если TYPE объявлен в пакете)

StackOverflow https://stackoverflow.com/questions/919330

Вопрос

Если «Переменная ассоциативного массива» объявлено во всем мире, способный использовать это в OPEN CURSOR USING заявление.

Если «Переменная ассоциативного массива» заявлено в упаковке, при использовании в OPEN CURSOR USING оператор, получаю ошибку компиляции.

Более подробная информация представлена ​​ниже

Я сохраняю некоторые значения в одной переменной ассоциативного массива.Позже повторим эти значения, перенеся их в курсор, как показано ниже:

strQuery := 'select DISTINCT column_value from table(CAST(:v_Assoc_Collection AS AssocArray_Date_t))';
OPEN RefCur_Item FOR strQuery USING v_Assoc_Collection;

Здесь я использовал переменную ассоциативного массива «v_Assoc_Collection», которая является типом «AssocArray_Date_t».

Если бы я объявил этот тип «AssocArray_Date_t» вне пакета [ CREATE OR REPLACE TYPE AssocArray_Date_t IS TABLE OF DATE; ], то он работает правильно.

Но, если я объявить тип внутри процедуры, получаю ошибку компиляции.

Ошибка:PLS-00457:Выражения должны быть из типов SQL.В :"Откройте Refcur_Item для strquery с помощью v_assoc_collection;"

Ошибка:ПЛ/SQL:Заявление проигнорировано.В :"Откройте Refcur_Item для strquery с помощью v_assoc_collection;"

Для справки код приведен ниже:

    -- Package Declaration
CREATE OR REPLACE PACKAGE AssocTypePackage
AS   
  Type CursorType IS REF CURSOR;      

  PROCEDURE AssocTypeProcedure(name IN VARCHAR2);
END;


-- Package Body
CREATE OR REPLACE PACKAGE BODY AssocTypePackage
AS
PROCEDURE AssocTypeProcedure(
  name IN VARCHAR2
)
IS  
  strQuery             VARCHAR2(4000);
  v_Assoc_Collection   AssocArray_Date_t := AssocArray_Date_t();
BEGIN
  FOR i IN 1..5
  LOOP      
    v_Assoc_Collection.EXTEND;
    v_Assoc_Collection(v_Assoc_Collection.COUNT) := <<someDate>>;               
  END LOOP;

  strQuery := 'select DISTINCT column_value from table(CAST(:v_Assoc_Collection AS AssocArray_Date_t))';
  OPEN RefCur_Item FOR strQuery USING v_Assoc_Collection;
  LOOP 
    -- ----
    -- some processing
    -- ----
  END LOOP; 
END  AssocTypeProcedure; 
END AssocTypePackage;
Это было полезно?

Решение

Вы должны знать, что в Oracle механизм SQL и механизм PL/SQL — это две разные вещи, хотя они могут вызывать друг друга.Чтобы использовать массивы в операторах SQL, они должны быть видимы механизму SQL, т.е.они должны быть объявлены как типы SQL с помощью оператора CREATE TYPE.Типы, созданные внутри пакета, просто невидимы для механизма SQL.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top