- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 8 anos, 4 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
26 de julho de 2016 às 3:50 pm #108318AndréParticipante
estou precisando pegar o nome da procedure que for chamada..
como o exemplo abaixo..
toda vez q entrar na proc1, jogar na tela “proc1”
tem alguma função que retorna o nome da procedure / função que a package chama? pesquisei mas nao encontrei..
encontrei sobre o ($$plsql_unit, $$plsql_line);
mas ele imprime somente o nome da package
encontrei tambem o owa_util.get_procedure
mas ele apresenta erro (ora-06502) se tento rodar devido não ser um ambiente cgi (pelo q encontrei na net)
create or replace package body pkg
asprocedure proc1 is
begin
dbms_output.put_line (‘proc1’);
end proc1 ;
end pkg;
/
26 de julho de 2016 às 5:14 pm #108320José Laurindo ChiappaModeradorBom, 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, http://www.thatjeffsmith.com/archive/2014/02/how-to-start-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…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 é :
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();
….Uma variação do tema é vc acionar o PL/SQL profiler , veja https://oracle-base.com/articles/11g/plsql-hierarchical-profiler-11gr1 para exemplo
OU
b) instrumentar o PL/SQL para que ele mande uma mensagem assim que começar a rotina : como vc tentou fazer com dbms_output e não conseguiu, outra opção pra isso seria vc colocar uma mensagem curta na coluna CLIENT_INFO da view interna V$SESSION (essa coluna é reservada para isso) e aí a tua aplicação abre uma nova janela, conecta no banco e fica fazendo pooling nessa view interna e imprime o conteúdo da coluna : http://www.toadworld.com/platforms/oracle/w/wiki/2367.dbms-application-info-set-client-info é um exemplo de uso da DBMS_APPLICATION, que é a built-in que vc usaria nas suas rotinas PL/SQL
OU
c) se vc quer saber o nome da rotina que está sendo executada ** SEM ** intrumentar nada, ie, sem escrever nada/sem alterar nem a sua aplicação nem as suas rotinas PL/SQL, a opção seria acompanhar a execução pelas views X$ internas : em https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::p11_question_id:767025833873 eu dou um exemplo…
[]s
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.