sql >> Database teknologi >  >> RDS >> Oracle

PL/SQL:er der en instruktion til helt at stoppe scriptudførelsen?

Spørgsmålet viser et batchscript med flere sætninger. RAISE_APPLICATION_ERROR() forlader kun en PL/SQL-blok (underprogram), ikke ud af det overordnede script (som påpeget af Justin), så det fortsætter med udsagn, der følger.

For batchscripts er det bedst at bruge NÅR SQLERROR EXIT. Ja, det er et SQLPlus-direktiv, ikke standard SQL, men er ret bærbart; mest populære Oracle-værktøjer, der understøtter scripts, understøtter dette direktiv, i det mindste delvist. Følgende eksempel fungerer i SQL Plus, SQL*Developer, Toad, SQLsmith og muligvis andre, og demonstrerer problemet, hvis du kommenterer linjen ud.

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

Hvis du fjerner WHEN SQLERROR, vil scriptet fortsætte og udføre 2. blok osv., hvilket er præcis det spørgsmålet beder om at undgå.

Fordelen, i dette tilfælde, ved grafiske værktøjer, der emulerer sqlplus, er, at de virkelig stopper scriptet og ikke sender resten af ​​scriptet til kommandoskallen som shell-kommandoer, hvilket er hvad der sker, hvis du indsætter scripts i SQLPlus kører i et konsolvindue. SQL Plus kan afslutte ved fejl, men de resterende bufferkommandoer vil så blive håndteret af OS-skallen, hvilket er lidt rodet og potentielt risikabelt, hvis du havde shell-kommandoer i kommentarerne (hvilket ikke er uhørt). Med SQLPlus er det altid bedst at oprette forbindelse og derefter udføre scriptet eller sende det i kommandolinjeargumentet (sqlplus scott/tiger @foo.sql) for at undgå dette.



  1. PostgreSQL - Hvordan indsætter jeg Base64 billedstrenge i en BYTEA kolonne?

  2. Hvad er den semantiske forskel mellem WHERE og HAVING?

  3. Metoden blev ikke fundet i klassen

  4. Er det muligt at udføre en udvælgelse i tabel af objekttype?