Bagaimana cara menangkap dan menangani hanya pengecualian Oracle tertentu?

20

Dari ini dan ini saya kira, bahwa tidak ada Pengecualian Sistem Bernama yang ditentukan sebelumnya untuk ORA-00955.

Bagaimana saya bisa menulis ulang yang berikut untuk menangkap hanya kesalahan ORA-00955?

begin
      EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
exception when OTHERS then
    Null;
end;

BTW Apakah ada sintaks untuk menangkap kesalahan dengan hanya memberikan kode kesalahan?

bernd_k
sumber

Jawaban:

33

Anda memiliki dua opsi:


Lihat pengecualian secara langsung dengan nomor:

BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    WHEN OTHERS THEN
      IF SQLCODE = -955 THEN
        NULL; -- suppresses ORA-00955 exception
      ELSE
         RAISE;
      END IF;
END; 

Opsi lainnya adalah menggunakan EXCEPTION_INITarahan Pragma untuk mengikat nomor kesalahan Oracle yang diketahui ke pengecualian yang ditentukan pengguna;

DECLARE
   name_in_use exception; --declare a user defined exception
   pragma exception_init( name_in_use, -955 ); --bind the error code to the above 
BEGIN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE S_TEST START WITH 1 INCREMENT BY 1';
EXCEPTION
    when name_in_use then
       null; --suppress ORA-00955 exception
END; 

BTW Apakah ada sintaks untuk menangkap kesalahan dengan hanya memberikan kode kesalahan?

Ya, saya sudah menunjukkannya pada contoh pertama

Bacaan lebih lanjut untuk variasi tentang ini:

Sathyajith Bhat
sumber
1
tidak bisakah aku pergi begitu saja tanpa ketika orang lain menaikkan garis?
bernd_k
@bernd_k ya Anda melakukannya, itu merupakan pengecualian yang tidak tertangani
Sathyajith Bhat
2
Silakan tambahkan kenaikan gaji KETIKA ORANG LAIN saat sqlcodeTIDAK 955 =)
Vincent Malgrat
OP mungkin masih ingin meningkatkan kesalahan lainnya. Blok Exception Anda "sebagaimana adanya" berperilaku persis seperti SAAT LAIN KEMUDIAN NULL. Saya pikir OP menginginkan sesuatu yang lebih tepat dan halus.
Vincent Malgrat
@VincentMalgrat Anda benar.
Sathyajith Bhat
5

Mirip dengan apa yang telah disarankan Sathya, tetapi saya ingin menghindari when otherssepenuhnya jika memungkinkan - pengecualian yang tidak tertangani biasanya merupakan hasil yang benar untuk pengecualian yang tidak secara khusus Anda tangani:

create sequence foo;
/*
sequence FOO created.
*/
declare
  name_is_already_used_955 exception;
  pragma exception_init(name_is_already_used_955,-955);
begin
  execute immediate 'create sequence foo';
exception when name_is_already_used_955 then null;
end;
/
/*
anonymous block completed
*/
Jack Douglas
sumber
Itulah tepatnya yang saya ringkas dari proposal Sathya sendiri.
bernd_k