Oracle db tavolo con vista / sistema per verificare se dato parte di un pacchetto è una procedura o una funzione
-
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
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.