Tabela de visualização/sistema do Oracle DB para verificar se a parte de um pacote é um procedimento ou uma função
-
23-09-2019 - |
Pergunta
Estou usando o Oracle Tabelas do sistema Para obter alguns metadados sobre os pacotes em nosso banco de dados.
Aqui está uma das minhas perguntas:
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
Também quero descobrir se o objeto especificado é uma função, um procedimento ou um tipo. Não consigo encontrar uma maneira direta de extrair os dados diretamente de uma tabela.
Observe: Não quero ter que analisá -lo de All_sources.
Solução
Acontece que existe uma visualização all_arguments onde você pode obter todos os parâmetros para um método em um pacote. Quando o método é uma função, há um argumento com um nome nulo representando o valor de retorno. Portanto, se você ingressar contra o All_arguments, poderá determinar se uma entrada all_procedures é uma função ou um procedimento. O que se segue é um exemplo mostrando essa seleção.
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>'
Outras dicas
SQL> select distinct object_type from user_procedures;
OBJECT_TYPE
-------------------
PROCEDURE
PACKAGE
TRIGGER
FUNCTION
Eu suspeito que alguém não terá nenhuma escolha. Pelo menos é bem formatado - todos os tipos começam com o tipo e assim por diante.
Você pode usar o SQL*plus e o DESC
Comando, que funciona em pacotes:
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
Iterando os pacotes e analisando os resultados - é uma estrutura mais fácil analisar do que o dba_source - você pode obter o que deseja. Uma advertência para lembrar; pacotes suportam a sobrecarga para que você possa ter os dois FUNCTION foo(date) RETURN date
, e PROCEDURE foo(varchar)
. Combinar apenas pelo nome pode não ser suficiente.