Ocasionalmente, recebo um script que funcionará bem no SQL Developer ou no Toad, mas requer modificação para ser executado com sucesso no SQL*Plus. Aqui está um exemplo de pior caso contendo várias instruções, cada uma com linhas em branco, ponto e vírgula e barras:
INSERT INTO t1 VALUES ('a
;
/
');
INSERT INTO t1 VALUES ('b
;
/
');
DELETE FROM t1 WHERE c1 = 'c
;
/
';
Por vários motivos, essas instruções precisam ser executadas no SQL*Plus. As linhas em branco são fáceis de resolver com um simples...
set sqlblanklines on
Estou ciente de que o sqlterminator
pode ser alterado e/ou desativado, mas ambos exigiriam modificações no código, o primeiro move o problema sem resolvê-lo e nenhum deles resolve o problema da barra incorporada.
A melhor resposta seria uma maneira de permitir que essas instruções sejam executadas sem modificação alterando o ambiente de alguma forma (como o sqlblanklines faz). Se isso não for possível, talvez haja uma maneira de modificar programaticamente os scripts. Estou tentando evitar alterações manuais.
Você pode fazer a maior parte disso usando um login.sql. login.sql é executado durante - surpreendente - login e é carregado de seu SQLPATH ou diretório atual. Para os exemplos que você deu, você realmente escolheu o pior caso.
O problema é o sqlterminator. O que quer que você coloque lá, a barra é mantida como um sqlterminator gratuito. Ao lado disso, o sqlplus primeiro verifica o sqlterminator e faz isso antes de verificar o terminador de string. Um bug se você me perguntar. A barra pode ser usada em uma string desde que não esteja sozinha em uma linha separada. Assim que o sqlplus encontra o caractere especificado como sqlterminator, ele ignora todo o resto e para de ler.
A barra pode ser tratada, desde que não esteja sozinha em uma linha.
login.sql contém:
leigh.sql contém:
execute o script:
Não há necessidade de mexer com blocos de início/fim. Não pode manipular sqlterminator dentro do comando, não importa onde esteja, em uma string ou não, não pode manipular linhas com barra sozinha em uma linha em uma string.
As instruções de inserção com linhas em branco e ponto e vírgula serão bem-sucedidas se colocadas dentro dos blocos BEGIN...END. Essa alteração pode ser feita usando um script, mas o script falharia se contivesse instruções DDL que não pudessem ser executadas dentro de um bloco sem executar imediato.
Esta solução também não resolve o problema / incorporado.
Minha solução alternativa:
Parece que o terminador de comando é ignorado dentro da instrução do corpo.