vue / table système Oracle pour vérifier si une partie d'un paquet, est une procédure ou une fonction
-
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
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.