如何编译保存在表中的PL/SQL源?

Jef*_*eff 1 oracle plsql

如何编译我目前在Oracle表中保存的PL/SQL源代码?(我正在从USER_SOURCE视图中复制源代码,然后我将删除这些对象,并希望从我保存的副本中恢复.)

我确信有一种简单的方法,但我只是没有输入正确的搜索条件.

Kac*_*per 6

试试这个:

declare
 text varchar2(4000);
begin
 select code into text from bkp_table;
 execute immediate 'create or replace ' || text;
end;
/
Run Code Online (Sandbox Code Playgroud)

好的,如果所有代码行都存储在单行中,则此方法有效.如果要执行存储在多行中的代码,您应该执行以下操作:

declare 
  text varchar2(32767);
begin
  select listagg(text, ' ') within group (order by line) into text from all_source where name = 'MYPROC';
  execute immediate 'create or replace ' || text;
end;
/
Run Code Online (Sandbox Code Playgroud)

当32767个字符太少时问题就开始了.在这种情况下,这可能是一个解决方案:

declare 
  text clob;
begin
for x in (select text from all_source where name = 'LONGTEST') loop
  text := text || x.text;
end loop;
  execute immediate 'create or replace ' || text;
end;
/
Run Code Online (Sandbox Code Playgroud)

此外,也请一看为什么它是一个有点奇怪的东西.

编辑

建议改为dbms_lob,在这种情况下clob需要初始化:

declare 
  text clob := ' ';
begin
for x in (select text from all_source where name = 'LONGTEST') loop
  dbms_lob.append(text, x.text);
end loop;
  execute immediate 'create or replace ' || text;
end;
/
Run Code Online (Sandbox Code Playgroud)