[oracle_br] Re: get name procedure function
Verdade André, as funcões da package OWA foram pensadas para serem usadas num ambiente WEB, cfrme o manual correspondente (Database PL/SQL Packages and Types Reference, no capítulo sobre OWA_UTIL) nos diz : " The OWA_UTIL package contains utility subprograms for performing operations such as getting the value of CGI environment variables, printing the data that is returned to the client, and printing the results of a query in an HTML table ... " ** PROVAVELMENTE ** é disso, inclusive, que vc viu ref e quis dizer quando falou em 'CGI', 'erro de ambiente não-CGI' no post original, imagino []s Chiappa
[oracle_br] Re: get name procedure function
OK, tá um pouco mais claro o que vc quer, mas antes de mais nada, ** PARA QUE ** vc quer isso ?? Isso eu já tinha perguntado logo de cara na minha resposta Como eu tinha dito, SE o teu objetivo é algum tipo de DEBUG, ie, de maneira excepcional/não-rotineira vc quer confirmar que uma procedure X está corretamente chamando Y que chama Z para corrigir algum erro de fluxo/lógica, as opções de DEBUG, de TRACE e de obter a Lista de Programas em Execução a partir das X$ continuam de péEssa opção ** VAI TE POUPAR ** um monte de recodificação nas suas rotinas, mas não sei se te atende... SE não for para isso (ie, não é algo excepcional mas sim algo que vc quer definitivamente, por qualquer motivo que for) e/ou as outras opções não te atendem, aí vc VAI TER QUE instrumentar (ie, escrever linhas adicionais no seu código), não tem jeito, e como vc esclareceu que é uma rotina PL/SQL que chama outra rotina PL/SQL (e provavelmente chama outra e outra) essa Instrumentação/código a mais vc VAI TER QUE adicionar nas rotinas PL/SQL, mesmo Confirmo que que ** não há ** nenhuma "variável global", nenhuma "diretiva de compilação", nenhum "algo como 'get_name_procedure'" que funcione para objetos dentro de uma package, que é seu caso (como vc já comprovou, as $$ não chegam a esse detalhe)... Porém, Antes de listar as possibilidades que vc pode usar no código PL/SQL que vc vai adicionar a todas as rotinas PL/SQL que quiser, deixe-me apenas (pela última vez) repisar o ponto da arquitetura de funcionamento do PL/SQL : vc vai usar alguma combinação das técnicas que listarei para obter o nome da procedure em execução (ou ainda melhor, todo o call stack, ie, toda a linha de execução que chegou até a rotina atual), ok, mas REAFIRMO que o PL/SQL ** não tem acesso ** a terminal nem a nada assim : para "exibir na tela" a informação que vc coletou na sua rotina PL/SQL , é por sua conta OU adaptar exibição do buffer DBMS_OUTPUT OU escrever no seu aplicativo de front-end alguma coisa que leia a informação (a partir de um buffer, de uma GTT, de uma variável global/context, de um arquivo-texto, seja onde for que a rotina PL/SQL guardou) do nome da rotina e a exiba... Isso posto, o que vc pode usar nesse código a mais que vc vai ter que adicionar em ** todas ** as suas rotinas PL/SQL é : 1) alterar ** TODAS ** as suas rotinas para usar as built-ins do PL/SQL que formatam o call stack, ie, toda a lista de execuções que chegaram até a rotina atual e gravar a info nalgum lugar : no 11g vc usava pra isso a DBMS_UTILITY.FORMAT_CALL_STACK (veja http://www.oracle.com/technetwork/issue-archive/2014/14-jan/o14plsql-2045346.html para exemplo), e no 12c ganhamos uma built-in própria no banco pra isso, a UTL_CALL_STACK (https://oracle-base.com/articles/12c/utl-call-stack-12cr1 exemplifica) ou 2) fazer como vc estava pensando mesmo, ie : alterar ** todas ** as suas rotinas para ter um parâmetro string a mais e alterar TODAS as chamadas para rotinas de modo a incluir esse parâmetro a mais. Por exemplo, se uma procedure PACKAGEX.P1 vai chamar uma rotina PACKAGEY.P2 a chamada ao invés de ser : PACKAGEY.P2(parâmetrosnecessarios) deveria passar a ser : PACKAGEY.P2(parâmetrosnecessários, 'PACKAGEX.P1 chamando PACKAGEY.P2'); ou 3) alterar ** TODAS ** as suas rotinas para que, antes de chamar uma outra rotina, guardar em algum lugar (buffer DBMS_OUTPUT, tabela, GTT, context, variável global, arquivo-texto no servidor, o que for) a informação de nomes das rotinas, E alterar ** TODAS ** as suas rotinas para que assim que startarem lerem a info previamente gravada É isso, ou então alguma pequena variação do tema, penso eu []s Chiappa
[oracle_br] Re: get name procedure function
Olá Amanda.. obrigado por sua resposta é isso mesmo, mas não funcionou usando o owa_util.GET_PROCEDURE apresenta o erro ORA-06502 mas encontrei esse link dizendo que o pacote OWA_UTIL faz parte do kit de ferramentas web que não é o meu caso.. portanto apresenta esse 06502 error ORA-06502 http://www.dbasupport.com/forums/showthread.php?53308-error-ORA-06502 http://www.dbasupport.com/forums/showthread.php?53308-error-ORA-06502 error ORA-06502 http://www.dbasupport.com/forums/showthread.php?53308-error-ORA-06502 Hi, I wrote this piece of code to get current procedure name but having error 6502 when executing it. Can any one know why is it so? Thks Visualizar em www.dbasupport... http://www.dbasupport.com/forums/showthread.php?53308-error-ORA-06502 Visualização pelo Yahoo
[oracle_br] Re: get name procedure function
Olá Meninos, sou nova aqui eu entendi algo assim create or replace package body pkg_qualqueras procedure verifica_nome(nome varchar2) is begin executa algo com o nome? . . . end; end pkg_qualquer; create or replace package body pkg as procedure teste1 is begin . . . pkg_qualquer.verifica_nome(owa_util.get_procedure) . . . end; procedure teste2 is begin . . . pkg_qualquer.verifica_nome(owa_util.get_procedure) . . . end; end pkg; isso não funcionou? se entendi errado me desculpe Amanda
[oracle_br] Re: get name procedure function
obrigado pela sua resposta Chiappa deixando mais claro o que preciso o dbms eu coloquei somente para exemplificar, não estou usando o mesmo como imaginou. o que preciso é passar o nome da procedure para uma outra package como parametro, imaginando algo mais simples, achei que tivesse algo como "get_name_procedure".
[oracle_br] Re: get name procedure function
Oi, tudo jóia ? Eu havia dado uma resposta (que vc provavelmente até já viu) num outro fórum mas se vc não se importar, vou colar aqui a mesma resposta - não só para que outras pessoas que precisem tenham outra chance de encontrar MAS também para ter outra chance de provocar eventuais respostas, outros pontos de vistas e outras Possibilidades que não me ocorreram : entre outras coisas, esse tipo de aprendizado/troca de idéias para que eu tenha crescimento profissional (já que essa coisa de banco de dados é o que paga o leitinho das crianças) é uma das coisas que me move... Então segue : bom, primeiro não entendi patavina sobre essa sua obs de "não é ambiente CGI" - o que que é isso no contexto de programação PL/SQL no database ?? Me parece ser algum conceito da tua linguagem/tool/ambiente de desenvolvimento... A próxima pergunta é a de sempre : PARA QUE vc quer saber o nome do PL/SQL em execução, é para fim de debug (ie, numa ÚNICA VEZ vc quer acompanhar o comportamento de rotinas PL/SQL, provavelmente para analisar algum erro lógico ?? Se é isso, considere a opção de ** DEBUGAR ** o PL/SQL, www.thatjeffsmith.com/archive/2014/02/ho...-the-plsql-debugger/ exemplifica : com esse recurso vc tem até mais recursos, podendo colocar BREAKPOINTs além de acompanhar linha a linha a execução A questão apenas é que para debugar PL/SQL no SQL Developer vc tem que estar executando o PL/SQL em questão a partir do SQL developer, nem sempre isso é possível... Muitas vezes é totalmente possível vc levantar os parâmetros que estão sendo passados e executar o PL/SQL em questão manualmente no SQL developer informando esses parâmetros, mas às vezes não é Aí finalmente a sua Resposta : se ainda não sabia, *** SAIBA *** que a linguagem PL/SQL absolutamente *** NÃO TEM NENHUM COMANDO PARA INTERAGIR COM TELA/FRONT-END *** : sendo a linguagem de programação back-end que é, o PL/SQL NÂO tem comando para print de texto, NÃO tem comando pra criar uma janela, NÃO tem comando para receber input via teclado do usuário, NÃO tem comando pra interagir com mouse ou impressora PL/SQL é uma linguagem feita para manipular (com extrema eficiência) dados dentro do banco de dados, NADA MAIS que isso Nesse contexto, o que o DBMS_OUTPUT faz NÂO É imprimir coisa NENHUMA, é simplesmente colocar uma string num buffer, e Alguns ambientes capazes de executar rotinas PL/SQL (como o sqlplus) foram programados para reconhecer e exibir o conteúdo desse buffer... Yes ??? Então se a tua linguagem/ambiente/tool de programação de onde vc tá chamando o PL/SQL não exibe nada, COM CERTEZA ela simplesmente Não Foi Programada para reconhecer e exibir o conteúdo do buffer Tá claro ? É alguma coisa EXTERNA ao PL/SQL e que o PL/SQL Não Tem Como interferir... Porém antes de desistir Tenha ** certeza ** que a sua tool/linguagem de programação Realmente Não Foi programada para reconhecer o buffer do DBMS_OUTPUT (** muitas ** tem esse Suporte mas simplesmente não está Ativado), e se tiver Dúvidas sobre isso numa outra mensagem *** DETALHE EXATAMENTE ** qual é essa tool/linguagem/ambiente de programação que vc está usando, que eventualmente quem trabalhar com ela/a conhecer pode palpitar : por exemplo, APEX rodando num web browser em princípio não tem esse Suporte built-in mas http://oraclequirks.blogspot.com.br/2007/08/practical-example-of-using-global.html exemplifica como se ler o conteúdo do buffer do DBMS_OUTPUT, persistir numa GTT e aí é trivial fazer um select na GTT dentro da aplicação... Registro aqui, em AINDA OUTRA variação possível, que desde muito tempo nós sempre tivemos a chance de chamar de dentro do PL/SQL rotinas feitas em linguagens que tem acesso ao hardware/periféricos como exibição em tela, impressoras e quetais : duas das mais comuns são C (via EXTERNAL PROCEDURES) e Java (via JVM interna no RDBMS Oracle, se disponível na sua instalação) : não vou usar esse recurso, entre outras questões porque ele demanda Conhecimento e Pesquisa, mas fica a Possibilidade... O que vc pode fazer num caso onde o buffer do DBMS_OUTPUT não tá sendo reconhecido/impresso pela tua tool/ambiente que chama a rotina PL/SQL E não é viável debugar no SQL Developer ou similares é : a) o MAIS ÓBVIO, instrumentar o teu programa que vai chamar as rotinas PL/SQL para imprimir o nome da rotina que vai chamar : por exemplo, se fosse um programa C poderia ser algo do tipo : printf('Vou chamar a rotina nomedapackage.proc1'); exec nomedapackage.proc1(); printf('Vou Chamar a rotina nomedapackage.proc2'); exec nomedapackage.proc2(); (Como eu disse acima, é TOTALMENTE PARTE DA ARQUITETURA proposta vc desenvolver front-end em alguma outra linguagem/tool E desenvolver o back-end/manipulação de dados em PL/SQL que será chamado pelo front-end : justamente por isso a Oracle sempre primou por disponibilizar acesso à rotinas PL/SQL stored para o mais amplo espectro de linguagem/ambientes)... Uma