Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

PL/SQL:existe uma instrução para parar completamente a execução do script?


A pergunta mostra um script em lote de várias instruções. RAISE_APPLICATION_ERROR() apenas sai de um bloco PL/SQL (subprograma), não do script geral (como apontado por Justin), então continuará com as instruções a seguir.

Para scripts em lote, é melhor usar WHENEVER SQLERROR EXIT. Sim, é uma diretiva SQLPlus, não SQL padrão, mas é bastante portátil; as ferramentas Oracle mais populares que suportam scripts suportam essa diretiva, pelo menos parcialmente. O exemplo a seguir funciona em SQL Além disso, SQL*Developer, Toad, SQLsmith e possivelmente outros, e demonstra o problema, se você comentar a linha.
set serveroutput on

-- Without this line, things keep going
WHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;

BEGIN
  IF (1 > 0) THEN
    DBMS_OUTPUT.PUT_LINE('First thing');
    RAISE_APPLICATION_ERROR(-20000, 'Test failed'); -- not enough
  END IF;
END;
/

-- This will execute if you remove WHEN SQLERROR.., so RAISE_APPLICATION_ERROR is not enough
BEGIN
   DBMS_OUTPUT.PUT_LINE('Second thing - Executes anyway');
END;
/

Se você remover o WHEN SQLERROR, o script continuará e executará o 2º bloco, etc. que é exatamente o que a pergunta pede para evitar.

A vantagem, neste caso, de ferramentas gráficas que emulam sqlplus, é que elas realmente param o script e não enviam o restante do script para o shell de comando como comandos shell, que é o que acontece se você colar scripts no SQLPlus rodando em uma janela de console. SQL O Plus pode sair em caso de erro, mas os comandos armazenados em buffer restantes serão tratados pelo shell do sistema operacional, que é um pouco confuso e potencialmente arriscado, se você tiver comandos shell nos comentários (o que não é inédito). Com o SQLPlus, é sempre melhor conectar e depois executar o script ou passá-lo no argumento de linha de comando (sqlplus scott/tiger @foo.sql) para evitar isso.