1 2 3 4 5 6 7 8
| FUNCTION DBMS_METADATA.get_ddl (
object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'DDL')
RETURN CLOB; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
create table source_code (val clob);
insert into source_code (val)
select dbms_metadata.get_ddl(decode(object_type, 'PACKAGE BODY', 'PACKAGE', object_type), object_name, owner)
from all_objects
where object_type in ('PACKAGE BODY', 'PROCEDURE', 'FUNCTION')
and owner in (USER);
commit;
--update avec ta substitution
begin
for sourc in (select val from source_code) loop
execute immediate sourc.val;
end loop;
end; |
Il es impossible de faire un execute immediate avec un clob. Cependant, tu as trois options :
Suite à ta routine de remplacement de code dans la table, tu vérifies la longueur de ce code via, par exemple
select length(val) from source_code
et si tu as un longueur plus petite que 32767, tu peux transformer ton clob en varchar2(32767) qui est en passant la longueur maximale pour un varchar2 en pl/sql et faire un execute immediate.
Si ce n'est pas le cas et que ton code est plus grand que 32767, utile sql*plus en faisant un spool et fait un select de ta table. Cela aura pour effet de créer un fichier avec le résultat du select (en l'occurence, ton code) et tu pourras l'exécuter à bras après. Ou tu utilises utl_file pour créer les scripts manuellement en pl/sql et tu les executes à bras encore une fois.
Partager