Pular para o conteúdo

Fóruns Developer,Designer e Discoverer Problema ao emitir mensagens pelo metodo put_line e input de variáveis de ambiente no oracle SQL Developer Responder a: Problema ao emitir mensagens pelo metodo put_line e input de variáveis de ambiente no oracle SQL Developer

#145666
Avatar photoJosé Laurindo Chiappa
Moderador

    Blz ? Então, primeira coisa vc ** preferencialmente deveria ** ter criado um NOVO post no Forum, pois colocar uma nova pergunta´, com completamente OUTRO assunto, num tópico já respondido/fechado FACILMENTE pode causar que a sua nova pergunta não seja vista, foi o que aconteceu comigo aqui neste caso…
    Mas ok : PRIMEIRO, falando sobre o buffer DBMS_OUTPUT , ele só é exibido por uma tool que o RECONHEÇA (é o caso do Oracle SQL DEVELOPER, do sqlplus, e várias outras) MAS além disso vc TEM que ativar a exibição – pra isso normalmente há um comando tipo SET SERVEROUTPUT ON – eu Suponho que é ISSO que vc esqueceu de fazer, ie, ATIVAR A EXIBIÇÃO do buffer… No SQL DEVELOPER, se vc está executando um script em modo texto, similar ao sqlplus (via F5) vc PODE usar o mesmo comando de ativação no seu script OU, se vc estiver em modo gráfico/grid (executando seus comandos com F9) aí vc tem um BOTÃO específico pra isso, vide https://www.thatjeffsmith.com/archive/2012/03/dbms_output-in-sql-developer/ ….. E só falando, além de ativar a Exibição, normalmente vc deve indicar também um TAMANHO para o seu buffer, cujo limite máximo VARIA de acordo com a sua versão de banco – até o Oracle 10g o máximo era 1000000 , mais recentemente passou a aceitar UNLIMITED…

    O segundo ponto sobre variáveis, pra começo de conversa vc codificou :

    declare MATRICULA NUMBER:= '&MAT';

    ==> ORA, aspinhas-simples vc só usa pra strings, E vc tá definindo a variável MATRICULA como NUMBER!!!! Não faz sentido, tem IMPEDÃNCIA aí…

    O outro ponto é : TANTO o sql*plus QUANTO o SQL DEVELOPER estão PROGRAMADOS para sempre que, ao encontrarem um caracter & , assumirem que o identificador que vem depois do & é uma VARIÁVEL DE SUBSTITUIÇÃO, ie, um TEXTo que vai ser apendado/substituído pelo que vc digitar… SE vc na verdade quer que o & Não Seja Interpretado como um prefixo de variável, vc DESLIGA a substituição automática , com o comando SET DEFINE OFF…

    ==> SUPONDO que vc realmente quer indicar uma variável de substituição com o &, uma Observação final é que quando vc usa um & só, ele cria uma variável de substituição ‘temporária’, válida só pro statement onde está o & : normalmente não é isso o que vc quer, vc quer MANTER O VALOR, de modo que as próximas referências à variável NÂO FORCEM UM NOVO INPUT….

    Juntando tudo que falei, eu tenho o seguinte script no SQL DEVELOPER :

    SET SERVEROUTPUT ON SIZE UNLIMITED
    DECLARE
       MATRICULA NUMBER:= &&V_MATRIC;
    BEGIN
       dbms_output.put_line('Matricula=' || &&V_MATRIC);
    END;

    ao executar ele, eu recebo APENAS UM PROMPT pra input de valores, coloquei o valor 123 e o resultado na janela de saída de scripts é :

    antigo:DECLARE
       MATRICULA NUMBER:= &&V_MATRIC;
    BEGIN
       dbms_output.put_line('Matricula=' || &&V_MATRIC);
    END;
    novo:DECLARE
       MATRICULA NUMBER:= 123;
    BEGIN
       dbms_output.put_line('Matricula=' || 123);
    END;
    Matricula=123
    
    Procedimento PL/SQL concluído com sucesso.

    ==> Tá vendo depois da substituição MAS antes da msg de Procedimento concluído a saída do DBMS_OUTPUT ?? É isso aí…. E mostrando que REALMENTE eu criei a variável permanente, ao executar o comando DEFINE eu recebo na janela de sapída de scripts :

    DEFINE _DATE =  "03/04/20" (CHAR)
    DEFINE _CONNECT_IDENTIFIER =  "xepdb1" (CHAR)
    DEFINE _USER =  "SYSTEM" (CHAR)
    DEFINE _PRIVILEGE =  "UNKNOWN" (CHAR)
    DEFINE _SQLPLUS_RELEASE =  "0401000000" (CHAR)
    DEFINE _EDITOR =  "notepad" (CHAR)
    DEFINE _O_VERSION =  "Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
    Version 18.4.0.0.0" (CHAR)
    DEFINE _O_RELEASE =  "1800000000" (CHAR)
    DEFINE _PWD =  "D:\SQLDEVELOPER_v19_4\sqldeveloper\sqldeveloper\bin" (CHAR)
    DEFINE V_MATRIC =  123 (NUMBER)

    ==> Tá vendo ali em cima a minha variável de substituição V_MATRIC ?? É isso aí… E tanto é assim que se eu executar NOVAMENTE o mesmo script citando a variável &&V_MATRIC ele NÂO PEDE pra inputar novo valor : se eu quiser LIMPAR a variável , removendo o valor da execução anterior, eu teria que usar o comando UNDEFINE no final do meu script, aí sim ele VAI pedir pra inputar um valor na primeira referência que é feita…
    Só uma OBSERVAÇÂO IMPORTANTE : esses comandos todos (e o conceito de variável de substituição mesmo) foram inventado NO SQLPLUS, no SQL DEVELOPER eles foram sendo introduzidos aos poucos – SE vc está usando uma versão ANTIGA do SQL DEVELOPER é MUITO CAPAZ de algo “quebrar”/não funcionar direito , nos meus testes eu usei a versão mais recente do SQL DEVELOPER 19.4 mas qquer coisa não tão distante disso deve funcionar…

    ==> PORÉM, cfrme vc viu na minha saída do meu script, as variáveis de substituição IMPLICAM em alguma poluição visual, pois os valores antes e depois da substituição VÃO SER exibidos por default : sendo assim, IMHO acho muito melhor usar BIND VARIABLES, que aí Não Só não existe substituição mas TAMBÉM não existe o problema do caracter & ser considerado um prefixo…a QUESTÃO SÓ É QUE AÍ VC tem QUE EXECUTAR O SCRIPT COM F9, em modo Gráfico…
    Veja o exemplo – tenho o script abaixo digitado :

    DECLARE
    MATRICULA NUMBER:= :V_MATRIC;
    BEGIN
    dbms_output.put_line('Vc digitou para Matricula=' || :V_MATRIC);
    END;

    Aí executo ele com F9, aparece uma janela pra informar o valor, eu informo 543, ó o que aparece na saída do script :

    Vc digitou para Matricula=543

    Procedimento PL/SQL concluído com sucesso.

    ==> MUITO MENOS POLUÍDO, né não ???

    Abraços,

    Chiappa