it-swarm.asia

كيفية التقاط ومعالجة استثناءات محددة فقط من Oracle؟

من هذا و هذا أظن أنه لا توجد استثناءات محددة مسبقًا لنظام أسماء ORA-00955.

كيف يمكنني إعادة كتابة ما يلي لالتقاط الخطأ ORA-00955 فقط؟

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

راجع للشغل هل هناك أي بنية للقبض على الأخطاء من خلال توفير رموز الخطأ فقط؟

21
bernd_k

أمامك خياران:


راجع الاستثناء مباشرة بالرقم:

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; 

الخيار الآخر هو استخدام EXCEPTION_INIT توجيه براغما لربط رقم خطأ أوراكل معروف بالاستثناء المحدد من قبل المستخدم ؛

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; 

راجع للشغل هل هناك أي بنية للقبض على الأخطاء من خلال توفير رموز الخطأ فقط؟

نعم ، لقد أظهرته في المثال الأول

مزيد من القراءة للاختلافات حول هذا:

34
Sathyajith Bhat

على غرار ما اقترحته ساتيا بالفعل ، لكني أحب أن أتجنب when others تمامًا إن أمكن - عادة ما يكون الاستثناء غير المعالج هو النتيجة الصحيحة للاستثناءات التي لا تتعامل معها على وجه التحديد:

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
*/
5
Jack says try topanswers.xyz