Ocasionalmente, recebo um script que funcionará bem no SQL Developer ou no Toad, mas requer modificações para ser executado com êxito 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 nem 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 maneira (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.
fonte
Respostas:
Você pode fazer isso usando um login.sql. O login.sql é executado durante o - surpreendente - login e é carregado a partir do seu SQLPATH ou diretório atual. Para os exemplos que você deu, você realmente escolheu o pior caso.
O problema é o sqlterminator. Tudo o que você coloca lá, a barra é mantida como um sqlterminator gratuito. Além disso, o sqlplus verifica primeiro o sqlterminator e faz isso antes de digitalizar para o terminador de string. Um bug se você me perguntar. A barra para frente 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 para frente pode ser manipulada, desde que não esteja sozinha em uma linha.
login.sql contém:
leigh.sql contém:
execute o script:
Não é necessário mexer nos blocos de início / fim. Não pode manipular o sqlterminator dentro do comando, não importa onde esteja, em uma sequência ou não, não pode manipular linhas com barra à frente sozinha em uma linha de uma sequência.
fonte
Inserir instruções com linhas em branco e ponto-e-vírgula serão bem-sucedidos se colocados dentro dos blocos BEGIN ... END. Essa alteração poderia ser feita usando um script, mas o script falharia se contivesse instruções DDL que não podem ser executadas dentro de um bloco sem serem executadas imediatamente.
Essa solução também não resolve o problema / incorporado.
fonte
Minha solução alternativa:
Parece que o terminador de comando é ignorado dentro da declaração do corpo.
fonte
fonte