sql >> Databasteknik >  >> RDS >> Oracle

PL/SQL:finns det en instruktion för att helt stoppa skriptkörningen?

Frågan visar ett batchskript med flera uttalanden. RAISE_APPLICATION_ERROR() lämnar endast ett PL/SQL-block (underprogram), inte ur det övergripande skriptet (som påpekat av Justin) så det kommer att fortsätta med påståenden som följer.

För batchskript är det bäst att använda NÄR SQLERROR EXIT. Ja, det är ett SQLPlus-direktiv, inte standard SQL, men är ganska portabelt; de mest populära Oracle-verktygen som stöder skript stöder detta direktiv, åtminstone delvis. Följande exempel fungerar i SQL Plus, SQL*Developer, Toad, SQLsmith och möjligen andra, och demonstrerar problemet, om du kommenterar raden.

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

Om du tar bort WHEN SQLERROR kommer skriptet att fortsätta och köra det andra blocket, etc. vilket är precis vad frågan frågar om att undvika.

Fördelen, i det här fallet, med grafiska verktyg som emulerar sqlplus, är att de verkligen stoppar skriptet och inte skickar resten av skriptet till kommandoskalet som skalkommandon, vilket är vad som händer om du klistrar in skript i SQLPlus körs i ett konsolfönster. SQL Plus kan avslutas vid fel, men de återstående buffrade kommandona kommer sedan att hanteras av OS-skalet, vilket är lite rörigt och potentiellt riskabelt, om du hade skalkommandon i kommentarerna (vilket inte är ovanligt). Med SQLPlus är det alltid bäst att ansluta och sedan köra skriptet, eller skicka det i kommandoradsargumentet (sqlplus scott/tiger @foo.sql) för att undvika detta.



  1. Förtydligande av sammanfogningsordning för skapande av tillfälliga tabeller

  2. Alternativ lösning till DCount och DLookup med MS SQL Server Backend

  3. Hur man använder Coalesce i MySQL

  4. Skapa en databasdump för specifika tabeller och poster Postgres