1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2017
    Messages : 9
    Points : 5
    Points
    5

    Par défaut Récupération du texte d'un package (NI all_source NI dbms_metadata.get_ddl)

    Ces Messieurs-Dames, bonjour !

    J'aimerai simplement récupérer le TEXTE d'un Package (en-tête et body idéalement), mais voilà :
    1. Un SELECT TEXTE FROM ALL_SOURCE ne me ramène pas les premiers "mots", à savoir 'create or replace PACKAGE mon_pack AS', mais seulement 'PACKAGE mon_pack AS'
    2. L'emploi de dbms_metadata.get_ddl me rajoute quant à lui un "create or replace editionable package "utilisateur".mon_pack AS'

    Alors voilà : pourquoi n'aurais-je pas le droit d'avoir EXACTEMENT ce que j'ai écrit ? Existe-t-il une troisième méthode ? Ou bien, sachant que je travaille avec SQL Developer, ce dernier filou a-t-il quelque chose à voir dans cette histoire ?

    J'espère avoir été clair !
    D'avance, merci !

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    5 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2007
    Messages : 5 524
    Points : 11 285
    Points
    11 285

    Par défaut

    Divers outil genre PL/SQL Developer, SQL Developper, Toad, etc. vous offre cette possibilité en sauvegardent dans un fichier.
    Dbms_metadata vous offre la possibilité de transformer le code source.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2017
    Messages : 9
    Points : 5
    Points
    5

    Par défaut

    En fait, j'aimerai une requête qui puisse me faire ça. J'ai un fichier .txt avec mes +/- 500 packages sous forme de liste, et je LOOP sur ce fichier pour extraire le texte de ces packages, mais il est impératif que le code soit similaire à celui que j'ai écrit dans SQL Developer. C'est pour ça que j'aimerai une alternative aux deux requêtes que j'ai cité dans mon post originel !

    En tout cas, merci pour ton aide !
    PS: Pas la peine de me vouvoyer, je suis une truite.

  4. #4
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Oracle ACE Director, DBA OCM 12c, consultant. En Suisse (dbi services)
    Inscrit en
    novembre 2007
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Oracle ACE Director, DBA OCM 12c, consultant. En Suisse (dbi services)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2007
    Messages : 1 545
    Points : 5 375
    Points
    5 375
    Billets dans le blog
    5

    Par défaut

    Bonjour,
    Est-ce que cen n'est pas un problème d'affichage? dbms_metadata retourne un CLOB. Sous Sous sqlplus il faut peut être faire 'set long'
    Franck Pachot - Consultant et formateur (dbi services) - Oracle ACED - Oracle Certified Master 12c - Oak Table member - twitter: @FranckPachot
    Besoin d'une formation Oracle 12cR2 ?


  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    5 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2007
    Messages : 5 524
    Points : 11 285
    Points
    11 285

    Par défaut

    Les truites elles aussi sont respectables!
    Ci dessous le point de départ.
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
     
    SQL> 
    SQL> CREATE OR REPLACE Package Null_Package Is
      2    Procedure Null_proc;
      3  End;
      4  /
    Package created
    SQL> CREATE OR REPLACE Package Body Null_Package Is
      2    Procedure Null_proc
      3    Is
      4    Begin
      5      Null;
      6    End;
      7  End;
      8  /
    Package body created
     
    SQL> set serveroutput on
    SQL> 
    SQL> Declare
      2    hOpenOrig   NUMBER;
      3    hModifyOrig NUMBER;
      4    hTransDDL   NUMBER;
      5    l_ddl       Clob;
      6  Begin
      7    --
      8    hOpenOrig := dbms_metadata.open('PACKAGE');
      9    --
     10    hModifyOrig := dbms_metadata.add_transform(hOpenOrig,'MODIFY');
     11    dbms_metadata.set_remap_param(hModifyOrig,'REMAP_SCHEMA','MNI',null);
     12    dbms_metadata.set_filter(hOpenOrig, 'NAME','NULL_PACKAGE');
     13    --
     14    hTransDDL := dbms_metadata.add_transform(hOpenOrig ,'DDL');
     15    dbms_metadata.set_transform_param(hTransDDL, 'PRETTY', TRUE);
     16    dbms_metadata.set_transform_param(hTransDDL, 'SQLTERMINATOR', TRUE);
     17    --
     18    l_ddl := dbms_metadata.fetch_clob(hOpenOrig);
     19    --
     20    dbms_output.put_line(SubStr(l_ddl,1,1000));
     21    --
     22    dbms_metadata.close(hOpenOrig);
     23  End;
     24  /
     
      CREATE OR REPLACE PACKAGE "NULL_PACKAGE" Is
      Procedure Null_proc;
    End;
     
    /
    CREATE OR REPLACE PACKAGE BODY "NULL_PACKAGE" Is
      Procedure Null_proc
      Is
      Begin
        Null;
      End;
    End;
     
    /
    PL/SQL procedure successfully completed
     
    SQL>

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2017
    Messages : 9
    Points : 5
    Points
    5

    Par défaut

    Merci pour vos conseils.

    Puisqu'il n'existe apparemment pas de requête "simple" pour cela, quelle conclusion peut on en tirer ?
    Pourquoi est ce que lorsque j'affiche un package sur SQL Developer, j'ai bien ce fameux "Create or replace" mais qu'il n'est pas dans le ALL_SOURCE? Est-ce une sorte d'affichage implicite, ou quelque chose comme ça qui m'échapperait ?

    PS : Les truites sont respectables tant qu'elles ne cassent pas le fil, ces garces !

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    5 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2007
    Messages : 5 524
    Points : 11 285
    Points
    11 285

    Par défaut

    All_source expose les sources des divers entités (packages, procédures, fonction, etc.), dans un certain sens c'est le code chargé dans la base lors de l'invocation d'une procédure packagée.
    Create [Or Replace] ... est une instruction DDL qui a pour conséquence la création de l'entité précisé!
    Donc all source ne peut pas contenir l'instruction DDL Create [Or Replace]

    Mais je me demande bien quel est vraiment votre problème! Normalement toutes les sources d'une application ne se "cherchent" pas dans la base mais dans un outil de versionning à partir duquel la base est chargée!
    Si vous avez juste la base sans les fichiers contenant le code c'est le temps d'y remédier à ce problème.

    Ensuite qu'est ce que ça veut dire "requête simple" pour vous ? Le bloc PL/SQL que je vous ai fourni comme exemple est "simple"! L'adapter pour traiter tous les packages d'un schéma: "c'est simple". Vous savez quoi: souvent "compliqué" est juste le mot qui désigne quelque chose de "simple" mais pour lequel nous n'avons pas envie de faire l'effort de comprendre!

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2017
    Messages : 9
    Points : 5
    Points
    5

    Par défaut

    Je ne peux pas utiliser de PL/SQL, c'est pour une requête éventuellement écrite dans un .SQL
    J'entends par une requête simple le résultat d'un simple SELECT comme dans les deux exemples que j'expliquais dans mon post originel, avec un simple appel à la table ALL_SOURCE ou à la fonction dbms_metadata.get_dd. Le tout tient en deux lignes.
    Je note pour la définition de 'compliqué', je la ressortirai la prochaine fois que j'expliquerai à mon vieux père ce que c'est que le PL/SQL, et je lui dirais qu'il ne fait pas assez d'efforts

    Bref, au final je m'en suis sorti en faisant un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT  CASE WHEN LINE = 1 THEN CONCAT('CREATE OR REPLACE ',TEXT) ELSE TEXT END
    FROM    ALL_SOURCE
    Merci quand même !

  9. #9
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    5 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2007
    Messages : 5 524
    Points : 11 285
    Points
    11 285

    Par défaut

    Dit également à votre père que tout ".SQL" connait la commande CALL et n'importe quelle procédure PL/SQL peut devenir du pur SQL via les fonctions pipelined!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP] Parser d'une page HTML pour récupération du texte
    Par trihanhcie dans le forum Scripts
    Réponses: 23
    Dernier message: 18/06/2011, 19h10
  2. [JDOM] Récupération du texte d'un élément XML‎
    Par kaninama dans le forum XML
    Réponses: 2
    Dernier message: 20/05/2006, 11h36
  3. Récupération de texte avec win32::ole
    Par bluecurve dans le forum Modules
    Réponses: 2
    Dernier message: 22/02/2006, 16h47
  4. Récupération du texte d'un lien hypertext
    Par -=ET=- dans le forum JavaScript
    Réponses: 4
    Dernier message: 23/05/2005, 17h08
  5. Problème de récupération de texte de formulaire
    Par bigourson dans le forum Formulaires
    Réponses: 4
    Dernier message: 15/09/2004, 16h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo