2010-05-05 5 views
4

Disons que j'ai un schéma ORACLE avec un paquet. Ce package définit les types, les fonctions, les procédures, etc:Obtenir les définitions d'objets de programmation ORACLE

CREATE PACKAGE... 
    DECLARE 
    FUNCTION ... 
    PROCEDURE ... 
END; 

Y at-il une question que je peux exécuter pour obtenir les définitions de ces objets individuels, sans l'emballage d'emballage?

Répondre

4

Si vous avez besoin des procédures/fonctions du package, vous pouvez utiliser user_procedures:

Create Package package_test As 
    Procedure dummy(x In Number); 
    Function dummy2 Return Number; 
End package_test; 

Sélectionnez object_name, nom_procédure De user_procedures Où object_name = 'PACKAGE_TEST';

retours

PACKAGE_TEST DUMMY 
PACKAGE_TEST DUMMY2 
PACKAGE_TEST  

Pour obtenir les paramètres, sélectionnez à partir user_arguments.


Si vous voulez que le code pour vos packages/procédures/fonctions, utilisez user_source pour les objets de votre utilisateur, all_source pour les objets de votre utilisateur a des subventions pour et dba_source pour tous les objets:

Select * 
From user_source 
Where name = 'YOUR_TEST' 
And type = 'PROCEDURE'; 

Si vous avez créé la procédure your_test avant:

Create Procedure your_test As 
Begin 
    dbms_output.put_line('test'); 
End your_test; 

retourne

YOUR_TEST PROCEDURE 1 Procedure your_test As 
YOUR_TEST PROCEDURE 2 Begin 
YOUR_TEST PROCEDURE 3 dbms_output.put_line('test'); 
YOUR_TEST PROCEDURE 4 End your_test; 
+0

Merci Peter pour votre réponse! J'ai exécuté Select * From dba_source (j'ai les permissions appropriées), mais je ne vois ni mon paquet ni ma procédure. Je suis nouveau à ORACLE, donc je pourrais facilement manquer quelque chose ici. J'ai remarqué que PL/SQL Developer met une marque d'erreur sur mon nœud de paquetage dans l'arborescence de gauche. Est-ce lié au problème que je rencontre? Voici mon code de package: créer pgtest paquet comme procédure p comme commence null; fin; fin; –

+0

Vous devez créer un paquet 'create package pgtest as procedure p; end; 'et un corps de package' create pgtest de corps de package en tant que procédure p comme begin null; fin; fin; ' –

+0

Ah Ha! Je les ai exécutées séparément, et maintenant le nœud semble OK. Mais, encore, pas d'enregistrement dans dba_source (ou autres). –

0

Il est possible de récupérer les signatures de méthodes individuelles à partir du dictionnaire de données. La vue pertinente est USER/ALL/DBA_ARGUMENTS.

Il ya quelques problèmes à surveiller. Si un argument a une postition de 0, c'est la valeur de retour d'une fonction et non un paramètre. Si le paramètre est un type complexe (tel qu'une table imbriquée ou un enregistrement PL/SQL), il apparaîtra plusieurs fois, chaque couche incrémentant le data_level.

La requête suivante joint les arguments à leurs procédures propriétaires. J'exclus les entrées dans USER_PROCEDURES au niveau du package (c'est-à-dire subprogram_id=0) et les entrées dans USER_ARGUMENTS pour les niveaux inférieurs de complex_type (c'est-à-dire, data_level > 0). La requête gère également les procédures sans aucun paramètre.

SQL> select o.object_type 
    2   , case 
    3    when o.object_type in ('PACKAGE', 'TYPE') then p.object_name 
    4    else null 
    5   end as object_name 
    6   , case 
    7    when o.object_type in ('PACKAGE', 'TYPE') then p.procedure_name 
    8    else p.object_name 
    9   end as procedure_name 
10   , case 
11    when a.position != 0 then a.argument_name 
12    when a.position = 0 then '** return value **' 
13    else null 
14   end as argument_name 
15   , a.data_type 
16 from user_arguments a 
17  , user_procedures p 
18  , user_objects o 
19 where o.object_type in ('PACKAGE', 'TYPE', 'FUNCTION', 'PROCEDURE') 
20 and p.object_name = o.object_name 
21 and p.subprogram_id != 0 
22 and a.object_id (+) = p.object_id 
23 and a.subprogram_id (+) = p.subprogram_id 
24 and a.data_level(+) = 0 
25 order by o.object_type, o.object_name, p.subprogram_id, a.position 
26/

OBJECT_TYPE   OBJECT_NAME     PROCEDURE_NAME     ARGUMENT_NAME   DATA_TYPE 
------------------- ------------------------------ ------------------------------ ------------------------------ ------- 
FUNCTION           COMPARE_OBJECTS    ** return value **  PL/SQL BOOLEAN 
FUNCTION           COMPARE_OBJECTS    OBJ1     UNDEFINED 
FUNCTION           COMPARE_OBJECTS    OBJ2     UNDEFINED 
FUNCTION           GET_EMPS      ** return value **  REF CURSOR 
FUNCTION           GET_EMPS      P_ARGS     UNDEFINED 
FUNCTION           STR_TO_NUMBER_TOKENS   ** return value **  TABLE 
FUNCTION           STR_TO_NUMBER_TOKENS   P_STRING    VARCHAR2 
FUNCTION           STR_TO_NUMBER_TOKENS   P_SEPARATOR   VARCHAR2 
PACKAGE    P23       POP_ARRAY      ** return value **  TABLE 
PACKAGE    P23       POP_ARRAY      P_NO     NUMBER 
PACKAGE    P23       INS_TABLE      P_ARRAY    TABLE 
PROCEDURE           CHANGE_EMP_SAL     P_ENO     NUMBER 
PROCEDURE           CHANGE_EMP_SAL     P_NEW_SAL    NUMBER 
PROCEDURE           PRINTE 
TYPE    NEW_EMP      EQUALS       ** return value **  RAW 
TYPE    NEW_EMP      EQUALS       SELF     OBJECT 

22 rows selected. 

SQL> 

Je aurait pu choisir d'autres informations utiles de USER_ARGUMENTS tels que IN_OUT ou si le paramètre est réglé par défaut, mais je me suis dit qu'il défilée déjà assez.

+0

Cela semble intéressant, mais pour une raison étrange, je ne vois pas mon proc dans le jeu de résultats. –

+0

@Yaakov Davis: Si vous sélectionnez 'user_source', vous ne voyez que les objets appartenant à votre utilisateur actuel. Si vous le faites en tant qu'utilisateur 'sys', vous obtenez uniquement les paquets qui ont été créés dans' sys'-schema. Avez-vous vérifié cela? –

+0

@YaakovDavis: sans voir vos données, il est difficile d'être sûr. Cependant, j'ai utilisé la version USER des vues, qui limite la requête aux objets du schéma actuel. Vous pouvez remplacer ces vues par les équivalents ALL_ ou DBA_, mais vous voudrez aussi restreindre sur la base de OWNER sinon vous serez balayé par un tsunami de résultats. – APC

Questions connexes