Tabela de visualização/sistema do Oracle DB para verificar se a parte de um pacote é um procedimento ou uma função

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

  •  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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top