- Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 4 anos, 8 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
29 de março de 2020 às 2:01 pm #145640Joao HenriqueParticipante
Problema ao emitir mensagens pelo metodo put_line e input de variáveis de ambiente no oracle SQL Developer.
Boa tarde, estou criando blocos anônimos na ferramenta SQL Developer da Oracle e em alguns pontos do bloco preciso imprimir mensagens através deste pacote (dbms_output.put_line) quando executo o bloco o SQL Developer não emite as mesagens padrões que informei ao método put_line() somente informa que o bloco foi executado com sucesso , outra dificuldade que estou tendo é quando a entrada de varíaveis, no bloco Declare nesta ferramenta, no exemplo abaixo estou declarando uma variável de entrada com o caracter & como exemplo : declare MATRICULA NUMBER:= ‘&MAT’;
Porém quando informo via teclado o valor de input da váriável o compilador informa o seguinte erro abaixo, deste já agradeço.
ORA-06550: linha 13, coluna 26:
PLS-00103: Encontrado o símbolo “:” quando um dos seguintes símbolos era esperado::= . ( @ % ;
06550. 00000 – “line %s, column %s:\n%s”
*Cause: Usually a PL/SQL compilation error.
*Action:3 de abril de 2020 às 5:31 pm #145666José Laurindo ChiappaModeradorBlz ? 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
3 de abril de 2020 às 6:20 pm #145667José Laurindo ChiappaModeradorAlguns pontos adicionais :
- desde há muitas versões atrás vc TAMBÉM tem a opção de ter uma janela SEPARADA para a saída do buffer de DBMS output : nas versões recentes, no menu Exbir, escolha a opção Saida DBMS, clicke no botão de + e escolha a conexão a ser capturada, que uma janela SEPARADA pra isso vai ser exibida…
- não foi o que vc perguntou mas SE vc está acostumado a executar e programar seus scripts em sqlplus, como eu disse a cada release mais e mais comandos sqlplus estão sendo aceitos pelo SQL DEVELOPER : assim, coisas como o ACCEPT e o PROMPT (pra vc permitir entrada de valores com um HINT pro operador), SET PAUSE (para pausar execução de uma query), COLUMN (pra vc formatar em modo texto uma saída de um SQL), etc, estão disponíveis também…. Pra vc ter a lista completa de comandos sql*plus que são aceitos no SQL DEVELOPER, use no help do SQL DEVELOPER no capítulo 1 “SQL DEVELOPER Concepts and Usage” no tópico ‘Using the SQL Worksheet’ o item “SQL*Plus Statements Supported in SQL Worksheet”
Abraços,
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.