Используя Oracle 12 c EE, как я могу использовать типы пакетов PL / SQL в подзапросах DML, не вызывая исключения "ORA-00902: неверный тип данных"?
Пример схемы
--PL/SQL package types.
create or replace package test_pkg as
TYPE type_record IS RECORD(
column1 NUMBER,
column2 NUMBER,
column3 NUMBER);
TYPE type_table IS TABLE OF type_record;
end;
/
--For comparison, the same types but as SQL objects.
CREATE OR REPLACE TYPE type_record IS OBJECT(
column1 NUMBER,
column2 NUMBER,
column3 NUMBER);
CREATE OR REPLACE TYPE type_table IS TABLE OF type_record;
--Table for testing DML.
create table tableX(a number);
PL / SQL Типы в SQL SELECT - РАБОТАЕТ
Преобразование из типов PL / SQL в SQL отлично работает для SELECTS. Приведенный ниже код работает нормально:
declare
vt test_pkg.type_table;
v_count number;
begin
select count(*)
into v_count
from dual
where not exists(select column1 from table(vt));
end;
/
PL / SQL Типы в SQL UPDATE - FAILS
Но использование тех же типов и подзапросов в выражении DML вызывает исключение: " ORA-00902: недопустимый тип данных / ORA-06512: в строке 4 ".
declare
vt test_pkg.type_table;
begin
update tableX set a = 1
where not exists (select column1 from table(vt));
end;
/
SQL Типы в SQL ОБНОВЛЕНИЕ - РАБОТАЕТ
Для сравнения используется SQL объекты в подзапросах прекрасно работает в DML:
declare
vt type_table;
begin
update tableX set a = 1
where not exists (select column1 from table(vt));
end;
/
Создание SQL объектов для каждого запроса - это обходной путь, но это создаст много ненужных объектов схемы. Есть ли способ заставить типы пакетов PL / SQL работать в подзапросах DML?