Что я делаю не так? Как это исправить? Я мог бы сделать это в течение
цикл, но не слишком ли он неэффективен для требуемой цели?
Если вы правильно проверите ошибку, вы можете увидеть ее. Ошибка говорит:
Локальные типы коллекций не допускаются в операторе SQL
Что означает в вашем блоке выполнения:
вставить в T_TEST (col01, col02) выбрать n_num, column_value из
стол (tn_test); * +1014 *
Выше указано NOT ALLOWED
.
До Oracle 11g вы не можете использовать Type
, объявленный в области действия, если PLSQL
блок непосредственно в операторе SQL
, используемом внутри блока. Вам необходимо изменить область объявления Type
за пределами области действия PLSQL
. Это означает, что вам нужно REMOVE
type t_num is table of number;
из спецификации пакета и создайте TYPE
вне области действия SQL
.
Итак, вы можете сделать это:
Create or replace type t_num is table of number;
См. Демоверсию ниже:
create table t_test (col01 number, col02 number);
-- Moving the type decalration under the scope of SQL.
Create or replace type t_num is table of number;
create or replace package p_test is
-- type t_num is table of number; --<-- Commenting the declaration since this is not allowed until 11g.
function rtn(arg_tn t_num)
return t_num PIPELINED;
end p_test;
/
create or replace package body p_test is
function rtn(arg_tn t_num)
return t_num PIPELINED
is
tn_row number;
begin
for i in arg_tn.first .. arg_tn.last
loop
tn_row := arg_tn(i);
pipe row(tn_row);
end loop;
return;
end;
end p_test;
Исполнение:
declare
tn_test t_num := t_num(10, 20, 30);
n_num number := 69;
begin
insert into T_TEST
(col01,
col02)
select n_num,
column_value
from table(tn_test);
commit;
end;
Тест:
SQL> Select * from T_TEST;
COL01 COL02
---------- ----------
69 10
69 20
69 30