› 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
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