Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

PL/SQL:apakah ada instruksi untuk sepenuhnya menghentikan eksekusi skrip?

Pertanyaannya menunjukkan skrip batch multi-pernyataan. RAISE_APPLICATION_ERROR() hanya keluar dari blok PL/SQL (sub-program), tidak keluar dari keseluruhan skrip (seperti yang ditunjukkan oleh Justin) sehingga akan dilanjutkan dengan pernyataan berikutnya.

Untuk skrip batch, yang terbaik adalah menggunakan KAPAN SAJA SQLERROR EXIT. Ya, ini adalah perintah SQLPlus, bukan SQL standar, tetapi cukup portabel; alat Oracle paling populer yang mendukung skrip mendukung arahan ini, setidaknya sebagian. Contoh berikut berfungsi di SQL Plus, SQL*Developer, Toad, SQLsmith, dan mungkin yang lain, dan menunjukkan masalahnya, jika Anda mengomentari baris.

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

Jika Anda menghapus WHEN SQLERROR, skrip akan melanjutkan dan mengeksekusi blok ke-2, dll. yang persis seperti pertanyaan yang harus dihindari.

Keuntungan, dalam contoh ini, alat grafis yang meniru sqlplus, adalah bahwa mereka benar-benar menghentikan skrip dan tidak mengirimkan sisa skrip ke shell perintah sebagai perintah shell, yang terjadi jika Anda menempelkan skrip ke SQLPlus berjalan di jendela konsol. SQL Plus mungkin keluar karena kesalahan, tetapi perintah buffer yang tersisa kemudian akan ditangani oleh shell OS, yang agak berantakan dan berpotensi berisiko, jika Anda memiliki perintah shell di komentar (yang tidak pernah terdengar). Dengan SQLPlus, selalu yang terbaik adalah menyambungkan, lalu menjalankan skrip, atau meneruskannya dalam argumen baris perintah (sqlplus scott/tiger @foo.sql) untuk menghindari hal ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa yang salah dengan kueri FIRST_VALUE ini?

  2. Bagaimana saya bisa melakukan pembaruan dinamis ini di Oracle?

  3. Masalah pada WSO2 dengan integrasi Oracle RDS Amazon

  4. Oracle mendapatkan tanggal yang diformat sebagai string antara dua tanggal

  5. Bagaimana cara menghapus nol di depan dari nilai hari dan bulan di Oracle, saat mengurai ke string menggunakan fungsi to_char?