Oracle Associative Array TYPE нельзя использовать в инструкции USING (если TYPE объявлен в пакете)
-
06-09-2019 - |
Вопрос
Если «Переменная ассоциативного массива» объявлено во всем мире, способный использовать это в 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.