Для примера определим пакет:
create or replace package sample_pkg is
type myRec is record(
id number,
name varchar2(50));
type myRecTbl is table of myRec;
type crs is ref cursor;
procedure test;
end sample_pkg;
Если в коде захочется сделать например так
function test_crs return crs is
myTab myRecTbl := myRecTbl();
p_id number;
p_name varchar2(50);
i number := 1;
res crs;
begin
for cr in (select * from sample_table) loop
myTab.extend();
myTab(i).id := cr.id;
myTab(i).name := cr.name;
i := i + 1;
end loop;
for x in (select * from table(myTab)) loop
dbms_output.put_line(x.name);
end loop;
return crs;
end test_crs;
будет ошибка Error: PLS-00642: local collection types not allowed in SQL statements, так как для использования в SQL тип доложен быть определен на уровне БД (схемы) а не в пакете.
create or replace package sample_pkg is
type myRec is record(
id number,
name varchar2(50));
type myRecTbl is table of myRec;
type crs is ref cursor;
procedure test;
end sample_pkg;
Если в коде захочется сделать например так
function test_crs return crs is
myTab myRecTbl := myRecTbl();
p_id number;
p_name varchar2(50);
i number := 1;
res crs;
begin
for cr in (select * from sample_table) loop
myTab.extend();
myTab(i).id := cr.id;
myTab(i).name := cr.name;
i := i + 1;
end loop;
for x in (select * from table(myTab)) loop
dbms_output.put_line(x.name);
end loop;
return crs;
end test_crs;
будет ошибка Error: PLS-00642: local collection types not allowed in SQL statements, так как для использования в SQL тип доложен быть определен на уровне БД (схемы) а не в пакете.
И что, а решение где?
ОтветитьУдалить