Bonjour tous le monde,
Je sollicite votre aide car je suis bloqué depuis un bon moment sur un problème qui vas paraitre simple à ceux qui ont de l'expérience.
Mon but est de sauvegarder le ddl d'un schéma à l'aide d'une procédure/fonction d'un package.
J'ai une première fonction qui récupère le type d'un objet en fonction du nom de celui-ci :
J'en ai une deuxième qui récupère le ddl d'un objet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 FUNCTION get_object_type(p_table_name IN Varchar2) RETURN Varchar2 AS object_type Varchar2(20); nb_object_type NUMBER; PARAM_NULL EXCEPTION; BEGIN SELECT COUNT(*) into nb_object_type FROM user_objects WHERE object_name = upper(p_table_name); SELECT object_type into object_type FROM user_objects WHERE object_name = upper(p_table_name); RETURN object_type; EXCEPTION WHEN NO_DATA_FOUND THEN Raise_application_error(-20002,'Aucun objet n a été trouvée'); WHEN TOO_MANY_ROWS THEN Raise_application_error(-20003,'Trop d objet ont été trouvées'); END get_object_type;
Puis une dernière qui récupère tous les ddl du schéma :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 FUNCTION get_ddl(object_name IN Varchar2) RETURN Varchar2 AS object_ddl Varchar2(4000); temp VARCHAR2(50); BEGIN temp:= get_object_type(object_name); dbms_metadata.set_filter() SELECT DBMS_METADATA.GET_DDL(upper(temp),upper(object_name)) into object_ddl FROM dual; RETURN object_ddl; END get_ddl;
Mon problème est que quand il doit sauvegarder les packages il y a une erreur car le package est composé de son body et de sa signature. Et la paf mon programme plante car les type sont identiques et que ma fonction get_ddl récupère en fonction du type et du nom de l'objet. Il me retourne donc un too_many_rows logique...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 PROCEDURE save_object_ddl(p_object IN Varchar2) AS object_type Varchar2(20); object_ddl Varchar2(4000); date_now Varchar2(50); table_existe number; TABLE_INEXISTANTE EXCEPTION; BEGIN SELECT COUNT(*) into table_existe FROM user_tables where table_name='SAVE_CODE'; IF (table_existe=1) THEN object_type := get_object_type(p_object); object_ddl := get_ddl(p_object); SELECT to_char(SYSDATE, 'dd.mm.yyyy hh24.mi.ss') INTO date_now FROM dual; Execute immediate'INSERT INTO save_code(nb, object_creation_code, row_creation_date) values(:1,:2,:3)' using seq_save_code .nextval, object_ddl,date_now; ELSE RAISE TABLE_INEXISTANTE; END IF; EXCEPTION WHEN TABLE_INEXISTANTE THEN Raise_application_error(-20006,'Table inexistante'); END save_object_ddl;
On m'a dit d'essayer avec un filtre sur un DBMS_METADATA.
J'essaye depuis un bon moment et je n'y arrive pas.
Est-ce que quelqu'un aurait la gentillesse de m'aider?
Merci d'avance d'avoir lu ce post et bonne journée.
Partager