Я бы создал динамическую таблицу и использовал свой курсор на этой таблице и возвращал конвейерный результат, чтобы выбрать результат, но у меня проблема.
Он не узнает мою новую таблицу
Это сработало, если я создаю таблицу перед выполнением функции в пакете и если я не выполняю немедленно созданную таблицу, но мне не нужна постоянная таблица, только временная таблица.
Где моя проблема?
Нажмите CTRL + F и выполните поиск - Теперь он не знает info_table, так что мне делать?
---- Так что это в моем пакете заголовка
type data_rec is record
(
l_util_id_source number,
l_util_id_cible number,
l_level number
) ;
type l_data_type is table of data_rec;
function obtenir_closeness return l_data_type pipelined ;
--And now my body
function obtenir_closeness return l_data_type pipelined
is
PRAGMA AUTONOMOUS_TRANSACTION;
cc sys_refcursor;
l_row lig_relation%ROWTYPE;
sorti_type data_rec;
V_STRING VARCHAR2(1000) := 'DECLARE
sorti_type data_rec;
BEGIN
FOR C1 IN (SELECT * FROM info_table) LOOP
null;
END LOOP;
END;';
begin
test3();
test4();
- Создать мою табличную работу.
execute immediate 'create table info_table (util_id_source varchar2(50),
util_id_cible varchar2(50),
level_connaissance number )';
commit;
- Вставьте в мою таблицу работы.
execute immediate 'insert into info_table select util_id_source,util_id_cible,1
from lig_relation
group by util_id_source,util_id_cible';
commit;
- Теперь он не знает info_table, так что мне делать?
OPEN cc for 'select * from info_table';
LOOP
FETCH cc INTO l_row;
EXIT WHEN CC%NOTFOUND;
sorti_type.l_util_id_source := l_row.util_id_source;
sorti_type.l_util_id_cible := l_row .util_id_cible;
sorti_type.l_level := l_row .level_connaissance;
pipe row(sorti_type);
END LOOP;
CLOSE cc;
test5();
return;
end obtenir_closeness ;
- это процедура 3
procedure test3
is
v_ctr number:=1;
v_execute_1 varchar2(32767);
begin
--This is where i insert what i need and it work.
v_execute_1:= 'begin
while :v_ctr<10
loop
FOR l_info IN(
select * from info_table where level_connaissance = :v_ctr)
loop
insert into info_table select l_info.util_id_source,util_id_cible,:v_ctr+1
from lig_relation
where util_id_source = l_info.util_id_cible
and (select count(*) from info_table where util_id_source = l_info.util_id_source and util_id_cible = lig_relation.util_id_cible)=0
group by util_id_source,util_id_cible;
end loop;
:v_ctr := :v_ctr+1;
end loop;
end;';
execute immediate v_execute_1 using in out v_ctr;
commit;
end test3;
- это процедура 5
procedure test5
is
Pragma Autonomous_transaction;
begin
execute immediate 'drop table info_table';
commit;
end test5;
END