updater через dblink

В таблице CREATE TABLE R_UDP_TABLE (name VARCHAR2(100),  txt CLOB); в поле clob содержится DDL код.

В цикле по всем линкам выполняется динамический неименованный блок который выполняет ddl через dblink. Входной параметр clob из таблицы — любая процедура, функция, пакет и т.д.

DBMS_LOB.getlength(cCLOB)/1024 — узнаем размер в КБ.

Также можно вытянуть ddl код так: SELECT DBMS_METADATA.GET_DDL(‘PROCEDURE’,’P_R_TEST’,’LIDER’) from dual;

create or replace procedure P_R_UPD as
cCLOB clob;
iCNT integer;
sNAME varchar2(100):='P_R_TEST';
begin

/* получить клоб из таблицы */
begin
select txt into cCLOB from R_UDP_TABLE where name=sNAME and rownum=1;
exception when NO_DATA_FOUND then
dbms_output.put_line('NO_DATA_FOUND');
end;

if(cCLOB is not null) then

/* размер клоба */
DBMS_OUTPUT.put_line('CLOB Size KB ' || round(DBMS_LOB.getlength(cCLOB)/1024, 2));

for cur in(select t.db_link from dba_db_links t where t.DB_LINK not like '%NB%') loop

/* Вызов динамического блока который создает ddl через dblink,
входной параметр clob - любая процедура, функция, пакет и т.д */
execute immediate
'begin
dbms_utility.exec_ddl_statement@'||cur.db_link||'(:cCLOB);
exception when others then
dbms_output.put_line(sqlerrm);
end;'
using cCLOB;

select count(*) into iCNT from V$DBLINK;
if iCNT>0 then
begin
DBMS_SESSION.CLOSE_DATABASE_LINK(cur.db_link);
exception when others then
dbms_output.put_line(iCNT);
end;
iCNT:=0;
end if;

end loop;

begin
DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
end;

end if;

end P_R_UPD;
/