Yalnızca belirli Oracle istisnalarını nasıl yakalayabilir ve yönetebilirim?


20

Dan bu ve bu ı tahmin yok ORA-00955 Adını Sistem İstisnalar var önceden olduğu.

Yalnızca ORA-00955 hatasını yakalamak için aşağıdakileri nasıl yeniden yazabilirim?

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

BTW Yalnızca hata kodlarını sağlayarak hataları yakalamak için herhangi bir sözdizimi var mı?

Yanıtlar:


33

İki seçeneğiniz var:


İstisnaya doğrudan numara ile başvurun:

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; 

Diğer seçenek, EXCEPTION_INITbilinen bir Oracle hata numarasını kullanıcı tanımlı özel duruma bağlamak için Pragma yönergesini kullanmaktır ;

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 Yalnızca hata kodlarını sağlayarak hataları yakalamak için herhangi bir sözdizimi var mı?

Evet, ilk örnekte gösterdim

Bununla ilgili varyasyonlar için daha fazla okuma:


1
diğerleri sıraya çıkınca gitmeden gidemem mi?
bernd_k

@bernd_k evet bunu yaparsınız, ancak işlenmeyen bir istisna olarak gider
Sathyajith Bhat

2
Lütfen sqlcode955 = DEĞİLDİRSE DIĞERLERİNE bir yükseltme ekleyin =)
Vincent Malgrat

OP, hala başka hatalar yapılmasını isteyebilir. İstisna bloğunuz "olduğu gibi", BOŞ ZAMAN ALDIĞINDA OLDUĞU gibi çalışır. Bence OP biraz daha hassas ve süptil bir şey istiyor.
Vincent Malgrat

@VincentMalgrat Haklısın.
Sathyajith Bhat

5

Sathya'nın zaten önerdiğine benzer, ancak when othersmümkünse tamamen kaçınmayı severim - işlenmeyen bir istisna genellikle özel olarak ele almadığınız istisnalar için doğru sonuçtur:

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

Tam olarak Sathyas'ın önerisini yoğunlaştırdım.
bernd_k
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.