Oracle db Ansicht / Systemtabelle zu überprüfen, ob gegeben Teil eines Pakets ein Verfahren oder eine Funktion ist

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

  •  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

.
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top