কীভাবে কেবলমাত্র নির্দিষ্ট ওরাকল ব্যতিক্রমগুলি ধরা এবং পরিচালনা করতে হয়?


20

থেকে এই এবং এই আমি অনুমান, কোন Ora-00955 জন্য পূর্বনির্ধারিত যে নামযুক্ত সিস্টেম ব্যতিক্রম।

কেবল ত্রুটিটি ORA-00955 ধরার জন্য আমি কীভাবে নিম্নলিখিতটি পুনরায় লিখতে পারি?

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

বিটিডাব্লু কি কেবল ত্রুটি-কোড সরবরাহ করে ত্রুটিগুলি ধরার কোনও বাক্য গঠন আছে?

উত্তর:


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প্রজ্ঞমা নির্দেশকে ব্যবহারকারীর সংজ্ঞায়িত ব্যতিক্রমের কাছে পরিচিত ওরেकल ত্রুটি নম্বরকে আবদ্ধ করার জন্য ব্যবহার করা;

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; 

বিটিডাব্লু কি কেবল ত্রুটি-কোড সরবরাহ করে ত্রুটিগুলি ধরার কোনও বাক্য গঠন আছে?

হ্যাঁ, আমি এটি প্রথম উদাহরণে প্রদর্শিত করেছি

এই বিষয়ে বিভিন্নতার জন্য আরও পড়া:


1
যখন অন্যরা লাইন বাড়ায় আমি কি কেবল যেতে পারি না?
bernd_k

@ বারান্দ_ কে হ্যাঁ আপনি এটি করেন তবে এটি একটি নিরস্ত্র ব্যতিক্রম হিসাবে যায়
সত্যজিৎ ভাট

2
sqlcode955 = = না হলে দয়া করে আপনার WHEN অন্যদের মধ্যে একটি যোগ করুন
ভিনসেন্ট মালগ্র্যাট

ওপি এখনও অন্য ত্রুটি উত্থাপন করতে চাইতে পারে। আপনার ব্যতিক্রম ব্লক "যেমনটি" হ'ল ঠিক ততক্ষণ অন্যদের মতো আচরণ করে। আমি মনে করি ওপি কিছুটা আরও সুনির্দিষ্ট এবং সূক্ষ্ম চায়।
ভিনসেন্ট ম্যালগ্র্যাট

@ ভিনসেন্টমালগ্র্যাট আপনি সঠিক
সত্যজিৎ ভাট

5

সাথ্য ইতিমধ্যে যা পরামর্শ দিয়েছে তার অনুরূপ, তবে আমি 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
*/

সত্যাতিসের প্রস্তাব থেকে আমি ঠিক তেমনই কনডেন্স করেছি।
bernd_k
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.