Oracle
 sql >> база данни >  >> RDS >> Oracle

PL/SQL:има ли инструкция за пълно спиране на изпълнението на скрипта?

Въпросът показва пакетен скрипт с множество изрази. RAISE_APPLICATION_ERROR() излиза само от PL/SQL блок (подпрограма), а не от цялостния скрипт (както е посочено от Джъстин), така че ще продължи с изразите, които следват.

За групови скриптове е най-добре да използвате WHENEVER SQLERROR EXIT. Да, това е директива SQLPlus, а не стандартен SQL, но е доста преносим; повечето популярни инструменти на Oracle, които поддържат скриптове, поддържат тази директива, поне частично. Следният пример работи в SQL Освен това, SQL*Developer, Toad, SQLsmith и евентуално други и демонстрира проблема, ако коментирате реда.

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

Ако премахнете WHEN SQLERROR, скриптът ще продължи и ще изпълни 2-ри блок и т.н., което е точно това, което въпросът изисква да избягвате.

Предимството, в този случай, на графичните инструменти, които емулират sqlplus, е, че те наистина спират скрипта и не изпращат остатъка от скрипта на командната обвивка като команди на обвивката, което се случва, ако поставите скриптове в SQLПлюс стартиране в конзолен прозорец. SQL Plus може да излезе при грешка, но останалите буферирани команди ще бъдат обработени от обвивката на OS, което е малко объркващо и потенциално рисковано, ако сте имали команди на обвивката в коментарите (което не е нечувано). С SQLPlus винаги е най-добре да се свържете и след това да изпълните скрипта или да го предадете в аргумента на командния ред (sqlplus scott/tiger @foo.sql), за да избегнете това.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте епоха в дата в sqlplus / Oracle

  2. Трябва ли да използвам JDBC getNString() вместо getString()?

  3. Какво означават квадратни скоби в Oracle SQL заявка?

  4. Oracle SQL:Разбиране на поведението на SYS_GUID(), когато присъства във вграден изглед?

  5. Spring JDBC Не можа да зареди клас JDBC драйвер [oracle.jdbc.driver.OracleDriver]