Oracle db Ansicht / Systemtabelle zu überprüfen, ob gegeben Teil eines Pakets ein Verfahren oder eine Funktion ist
-
23-09-2019 - |
Frage
Ich bin mit dem Oracle Systemtabellen einige Metadaten über das bekommen Pakete in unserer Datenbank.
Dies ist eine meiner Anfragen:
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
Ich mag auch, wenn das gegebene Objekt entweder eine Funktion, um herauszufinden, ein Verfahren oder eine Art. Ich kann nicht scheinen, einen direkten Weg zu finden, die Daten direkt aus einer Tabelle zu ziehen.
Bitte beachten Sie: Ich will nicht, es von all_sources zu analysieren haben
.Lösung
Es stellt sich heraus, dass es eine Ansicht all_arguments, wo Sie alle Parameter für ein Verfahren in einem Paket zu bekommen. Wenn das Verfahren gibt es eine Funktion ist ein Argument mit einem Null-Namen, den Rückgabewert repräsentieren. Also, wenn Sie gegen all_arguments beitreten können Sie bestimmen, ob ein bestimmtes all_procedures Eintrag eine Funktion oder ein Verfahren. Was folgt, ist ein Beispiel solch eine Auswahl zeigt.
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>'
Andere Tipps
SQL> select distinct object_type from user_procedures;
OBJECT_TYPE
-------------------
PROCEDURE
PACKAGE
TRIGGER
FUNCTION
Ich vermute, man wird keine andere Wahl haben. Zumindest ist es gut formatiert -. Alle Typen beginnen mit TYPE, und so weiter
Sie könnten SQL * Plus verwenden und den DESC
Befehl, der auf den Verpackungen funktioniert:
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
Mit dem über die Pakete laufen, und die Ergebnisse Parsing - es ist eine einfachere Struktur als DBA_SOURCE zu analysieren - Sie könnten bekommen, was Sie wollen. Ein Vorbehalt zu erinnern; Pakete unterstützen Überlastung, so dass Sie sowohl FUNCTION foo(date) RETURN date
und PROCEDURE foo(varchar)
haben könnte. Passende nur nach Namen möglicherweise nicht genug sein.