No SqlDeveloper estou tentando executar o seguinte SQL EXECUTE multilinha com comentários,
execute MYPKG.MYSP (null/*Param1*/, null/*Param2*/, 123/*Param3*/,
null/*Param4*/, etc.
Na primeira nova linha sinaliza o erro
execute MYPKG.MYSP (null/*Param1*/, null/*Param2*/, 123/*Param3*/, ; END;
ORA-06550: line 1, column 131:
PLS-00103: Encountered the symbol ";" when expecting one of the following:
( - + case mod new not null <an identifier>
<a double-quoted delimited-identifier> <a bind variable>
continue avg count current exists max min prior sql stddev
sum variance execute forall merge time timestamp interval
date <a string literal with character set specification>
<a number> <a single-quoted SQL string> pipe
<an alternatively-quoted st
e em cada nova linha subsequente depois disso
Error report -
Unknown Command
Não há ; em qualquer lugar nessas novas linhas. Como executo um SQL formatado em várias linhas sem reclamar de novas linhas ou comentários?
Não são os comentários. Se você olhar para o seu erro real novamente, não verá o que mostrou:
Na verdade, ele mostrará:
Isso ocorre porque
execute
é apenas um wrapper conveniente para um bloco anônimo e analisa apenas a linha atual do seu script. Portanto, ele executa efetivamente:Ele está adicionando o
BEGIN
ponto e vírgula final após a primeira linha da sua instrução eEND;
. E é isso que aparece na mensagem de erro. O restante da sua instrução multilinha é tratado como comandos independentes, e é por isso que são relatados como 'desconhecidos'.Você pode convertê-lo manualmente
execute
em um blocoBEGIN
/ explícitoEND;
ou forçar toda a sua chamada em uma única linha, ou pode usar o caractere de continuação de linha :Portanto, você pode adicionar um hífen no final de cada linha, o que fará com que o SQL Developer (os documentos são para SQL * Plus, mas ainda se aplicam) inclua todas essas linhas ao converter em
execute
um bloco anônimo:Pessoalmente, eu só uso
exec
para coisas rápidas e ad hoc e acho que é mais claro e simples usar blocos normais, completos e anônimos na maioria das vezes. Também torna mais fácil executar seu código em outro cliente, se necessário.