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 :
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;
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
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;
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
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;
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...

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.