sql >> Database >  >> RDS >> Oracle

PL/SQL:is er een instructie om de uitvoering van het script volledig te stoppen?

De vraag toont een batchscript met meerdere instructies. RAISE_APPLICATION_ERROR() komt alleen uit een PL/SQL-blok (subprogramma), niet uit het algemene script (zoals aangegeven door Justin), dus het gaat verder met de volgende instructies.

Voor batchscripts kunt u het beste WHENEVER SQLERROR EXIT gebruiken. Ja, het is een SQLPlus-richtlijn, geen standaard SQL, maar is redelijk overdraagbaar; de meest populaire Oracle-tools die scripts ondersteunen, ondersteunen deze richtlijn, althans gedeeltelijk. Het volgende voorbeeld werkt in SQL Plus, SQL*Developer, Toad, SQLsmith en mogelijk anderen, en demonstreert het probleem, als je commentaar geeft op de regel.

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;
/

Als u de WHEN SQLERROR verwijdert, gaat het script verder en voert het het 2e blok uit, enz., wat precies is wat de vraag vraagt ​​om te vermijden.

Het voordeel, in dit geval, van grafische tools die sqlplus emuleren, is dat ze het script echt stoppen en de rest van het script niet als shell-commando's naar de opdrachtshell sturen, wat gebeurt als je scripts in SQL plaktPlus draait in een consolevenster. SQL Plus kan bij een fout afsluiten, maar de resterende gebufferde commando's worden dan afgehandeld door de OS-shell, wat een beetje rommelig en potentieel riskant is, als je shell-commando's in de opmerkingen had (wat niet ongehoord is). Met SQLPlus is het altijd het beste om verbinding te maken en vervolgens het script uit te voeren, of het door te geven in het opdrachtregelargument (sqlplus scott/tiger @foo.sql) om dit te voorkomen.



  1. mysql vind kleinste + unieke id beschikbaar

  2. MySQL groepeert bepaalde resultaten in een array

  3. PostgreSQL COPY csv inclusief aanhalingstekens

  4. R-variabelen gebruiken voor een SQL-query