最初は、存在しないテーブルをキャッチするために例外を作成しようとしていました (-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