vue / table système Oracle pour vérifier si une partie d'un paquet, est une procédure ou une fonction

StackOverflow https://stackoverflow.com/questions/2343401

  •  23-09-2019
  •  | 
  •  

Question

J'utilise les tables système Oracle pour obtenir des métadonnées sur le Forfaits dans notre base de données.

Voici une de mes requêtes:

select AP.PROCEDURE_NAME
  from ALL_PROCEDURES ap
 where ap.object_name = :object_name
   and ap.owner=:owner
   and ap.procedure_name is not NULL
   and ap.procedure_name like :procedure_name

Je veux aussi savoir si l'objet donné est soit une fonction, une procédure ou un type. Je ne peux pas sembler trouver un moyen direct de tirer les données directement à partir d'une table.

S'il vous plaît noter:. Je ne veux pas avoir à l'analyser de all_sources

Était-ce utile?

La solution

Il se trouve qu'il ya une all_arguments vue où vous pouvez obtenir tous les paramètres pour une méthode dans un paquet. Lorsque le procédé est une fonction il y a un argument avec un nom null représentant la valeur de retour. Donc, si vous vous joignez à contre all_arguments vous pouvez déterminer si une entrée de all_procedures donnée est une fonction ou d'une procédure. Ce qui suit est un exemple montrant une telle sélection.

select CASE (Select count(*) from ALL_ARGUMENTS aa 
                       where aa.object_name=ap.procedure_name
                         and aa.object_id = ap.object_id 
                         and argument_name is null)
         WHEN 1 THEN 'FUNCTION'
         WHEN 0 THEN 'PROCEDURE'
         ELSE ''
       END as is_function, ap.*
  from all_procedures ap
 where ap.object_name like '<package name>'

Autres conseils

SQL> select distinct object_type from user_procedures;

OBJECT_TYPE
-------------------
PROCEDURE
PACKAGE
TRIGGER
FUNCTION

Je soupçonne que on n'a pas le choix. Au moins, il est bien formaté - tous les types commencent par TYPE, etc.

.

Vous pouvez utiliser SQL * Plus et la commande DESC, qui fonctionne sur les emballages:

SQL> desc dbms_application_info;
PROCEDURE READ_CLIENT_INFO
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 CLIENT_INFO                    VARCHAR2                OUT
PROCEDURE READ_MODULE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 MODULE_NAME                    VARCHAR2                OUT
 ACTION_NAME                    VARCHAR2                OUT
PROCEDURE SET_ACTION
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 ACTION_NAME                    VARCHAR2                IN
PROCEDURE SET_CLIENT_INFO
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 CLIENT_INFO                    VARCHAR2                IN
PROCEDURE SET_MODULE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 MODULE_NAME                    VARCHAR2                IN
 ACTION_NAME                    VARCHAR2                IN
PROCEDURE SET_SESSION_LONGOPS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 RINDEX                         BINARY_INTEGER          IN/OUT
 SLNO                           BINARY_INTEGER          IN/OUT
 OP_NAME                        VARCHAR2                IN     DEFAULT
 TARGET                         BINARY_INTEGER          IN     DEFAULT
 CONTEXT                        BINARY_INTEGER          IN     DEFAULT
 SOFAR                          NUMBER                  IN     DEFAULT
 TOTALWORK                      NUMBER                  IN     DEFAULT
 TARGET_DESC                    VARCHAR2                IN     DEFAULT
 UNITS                          VARCHAR2                IN     DEFAULT

Par itérer sur les paquets, et l'analyse des résultats - c'est une structure plus facile à analyser que DBA_SOURCE - vous pouvez obtenir ce que vous voulez. Une mise en garde à retenir; paquets prennent en charge la surcharge, vous pouvez donc avoir à la fois FUNCTION foo(date) RETURN date et PROCEDURE foo(varchar). Qu'aligner par nom peut ne pas être suffisant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top