1

最初は、存在しないテーブルをキャッチするために例外を作成しようとしていました (-00942)。Alex と Raj の両方からのフィードバックに基づいて、EXECUTE IMMEDIATE を使用するようにコードを修正しました。これはテーブルの識別に機能しましたが、テーブルを「従業員」から「従業員」に修正したとき、これはDBに存在するテーブルであり、EXECUTE IMMEDIATEを使用しなかった場合と同様に、コードがエラーなしで実行されることを期待していました.

キャッチオール例外を生成する代わりに、EXECUTE IMMEDIATE を使用するときにコードを例外なく実行することは可能ですか?

EXECUTE IMMEDIATE 'SELECT last_name INTO v_name FROM 従業員 WHERE 給与 = v_sal';

WHEN OTHERS THEN :g_message := 'その他のエラーが発生しました。';

コードが例外なく実行されることを望んでいました。

VARIABLE g_message VARCHAR2(250)

DEFINE p_sal = 12000

DECLARE 
   v_name employees.last_name%TYPE;
   v_sal employees.salary%TYPE := &p_sal;

   table_does_not_exist exception;  
   PRAGMA EXCEPTION_INIT(table_does_not_exist, -942);

BEGIN

   EXECUTE IMMEDIATE
   'SELECT last_name INTO v_name FROM employees WHERE salary = v_sal';

   DBMS_OUTPUT.put_line(v_name);


 EXCEPTION 

   WHEN table_does_not_exist then 
   :g_message := 'table dose not exist';  


   WHEN NO_DATA_FOUND THEN 
   :g_message := 'No employee with a salary of '||TO_CHAR(v_sal);  

   WHEN OTHERS THEN
   :g_message := 'Some other error occurred.';
 END;
 /
 PRINT g_message
4

1 に答える 1