[oracle_br] Re: get name procedure function

2016-07-27 Por tôpico jlchia...@yahoo.com.br [oracle_br]
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

2016-07-27 Por tôpico jlchia...@yahoo.com.br [oracle_br]
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

2016-07-27 Por tôpico drelu...@gmail.com [oracle_br]
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

2016-07-27 Por tôpico amand...@yahoo.com [oracle_br]
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

2016-07-27 Por tôpico drelu...@gmail.com [oracle_br]
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

2016-07-27 Por tôpico jlchia...@yahoo.com.br [oracle_br]
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