Oracle db tavolo con vista / sistema per verificare se dato parte di un pacchetto è una procedura o una funzione

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

  •  23-09-2019
  •  | 
  •  

Domanda

Sto usando le tabelle di sistema Oracle per ottenere alcuni metadati relativi al pacchetti nel nostro database.

Ecco una delle mie domande:

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

Voglio anche sapere se l'oggetto specificato è o una funzione, una procedura o un tipo. Non riesco a trovare un modo diretto per estrarre i dati direttamente da una tabella.

Nota:. non voglio avere per analizzare da all_sources

È stato utile?

Soluzione

Si scopre che c'è un all_arguments vista dove è possibile ottenere tutti i parametri per un metodo in un pacchetto. Quando il metodo è una funzione c'è una discussione con un nome nullo che rappresenta il valore di ritorno. Quindi, se si uniscono contro all_arguments è possibile determinare se una determinata voce di all_procedures è una funzione o una procedura. Quello che segue è un esempio che mostra come ad una selezione.

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>'

Altri suggerimenti

SQL> select distinct object_type from user_procedures;

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

ho il sospetto non avrà altra scelta. Almeno è ben formattato - tutti i tipi iniziano con TYPE, e così via

.

È possibile utilizzare SQL * Plus e il comando DESC, che funziona sui pacchetti:

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

Con l'iterazione di pacchetti, e l'analisi dei risultati - è una struttura più facile da analizzare rispetto DBA_SOURCE - si potrebbe ottenere quello che vuoi. Un avvertimento da ricordare; pacchetti di supporto sovraccarico così si potrebbe avere sia FUNCTION foo(date) RETURN date e PROCEDURE foo(varchar). Corrispondenza solo per nome potrebbe non essere sufficiente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top