จะจับและจัดการข้อยกเว้นเฉพาะของ Oracle ได้อย่างไร


20

จากนี้และนี่ฉันเดาว่าจะไม่มีข้อยกเว้นของระบบที่กำหนดชื่อไว้ล่วงหน้าสำหรับ ORA-00955

ฉันจะเขียนสิ่งต่อไปนี้เพื่อดักจับข้อผิดพลาด ORA-00955 เท่านั้นได้อย่างไร

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

BTW มีไวยากรณ์ใดที่จะตรวจจับข้อผิดพลาดโดยเพียงแค่ระบุรหัสข้อผิดพลาดหรือไม่?

คำตอบ:


33

คุณมีสองทางเลือก:


อ้างถึงข้อยกเว้นโดยตรงตามหมายเลข:

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คำสั่ง Pragma เพื่อผูกหมายเลขข้อผิดพลาดของ Oracle ที่รู้จักกับข้อยกเว้นที่ผู้ใช้กำหนด

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 มีไวยากรณ์ใดที่จะตรวจจับข้อผิดพลาดโดยเพียงแค่ระบุรหัสข้อผิดพลาดหรือไม่?

ใช่ฉันได้สาธิตมันในตัวอย่างแรก

อ่านเพิ่มเติมสำหรับรูปแบบต่าง ๆ เกี่ยวกับเรื่องนี้:


1
ฉันไปไม่ได้หรือไม่โดยที่ไม่มีคนอื่นยกสาย?
bernd_k

@bernd_k ใช่คุณทำเช่นนั้นมันจะเป็นข้อยกเว้นที่ไม่สามารถจัดการได้
Sathyajith Bhat

2
โปรดเพิ่มการเพิ่มในของคุณเมื่อคนอื่นเมื่อsqlcodeไม่ใช่ 955 =)
วินเซนต์ Malgrat

OP อาจยังต้องการมีข้อผิดพลาดเพิ่มขึ้น บล็อกการยกเว้นของคุณ "ตามที่เป็น" จะทำงานเหมือนกับที่ผู้อื่นเห็นเมื่อเป็นโมฆะ ฉันคิดว่า OP ต้องการบางสิ่งที่แม่นยำและลึกซึ้งยิ่งขึ้น
Vincent Malgrat

@VincentMalgrat คุณถูกต้อง
Sathyajith Bhat

5

คล้ายกับสิ่งที่ Sathya ได้แนะนำไปแล้ว แต่ฉันต้องการหลีกเลี่ยง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
*/

นั่นคือสิ่งที่ฉันย่อจาก Sathyas เสนอตัวเอง
bernd_k
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.