0

처음에는 존재하지 않는 테이블 (-00942)을 잡기 위해 예외를 만들려고했습니다. Alex와 Raj의 의견을 바탕으로 EXECUTE IMMEDIATE를 사용하도록 코드를 수정했습니다. 이 테이블을 식별하는 데에서 근무하지만 내가 'employe'에서 내 DB에 존재하는 테이블 인 'employees'로 테이블을 수정했을 때, EXECUTE를 사용하지 않은 경우와 같이 오류없이 실행되도록 코드를 예상했을 것입니다. 즉시.동적 SQL/예외 처리 -00942 - Oracle PL/SQL

EXECUTE IMMEDIATE를 사용할 때 예외없이 코드를 실행할 수 있습니까?

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

그 외의 경우 : 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 
+0

안녕 알렉스 - 내가 이제 고유 믿는 질문을 업데이 트했습니다. 참조 주셔서 감사합니다. 그것은 작동하지만 질문에 대한 후속 조치가 있습니다. –

+0

@SQL_rookie ... 귀하의 문제는 귀하가 귀하의 진술서를 실행하려했을 때 유효하며, "v_sal"을 이해하지 못했고 다른 예외로 귀결되었습니다. 값을 하드 코드하거나 해당 절을 제거하면 코드가 작동합니다. – XING

+0

알았어 - 실행 즉시 '직원으로부터 성을 선택하십시오 어디 salary = 12000'INTO v_name; 고마워요 –

답변

1

아래 시도 :

DECLARE 
    v_name employee.emp_name%TYPE; 
    v_sal employee.emp_sal%TYPE := 12000; 

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

BEGIN 

execute immediate 
    'SELECT emp_name 
    INTO v_name 
    FROM employee_l 
    WHERE emp_sal = v_sal'; 

    DBMS_OUTPUT.put_line(v_name); 


EXCEPTION 

    WHEN table_does_not_exist then 
    dbms_output.put_line('table dose not exist'); 


    WHEN NO_DATA_FOUND THEN 
    dbms_output.put_line( 'No employee with a salary of '||TO_CHAR(v_sal)); 

    WHEN OTHERS THEN 
    dbms_output.put_line('Some other error occurred.'); 
END; 
/