2017-12-13 7 views
2
그래서 여기

동안 코드는 다음과 같습니다PL/SQL 프로 시저, 인상 NO_DATA_FOUND 내 오라클 클래스에서 나에게 주어진 삽입

CREATE OR REPLACE PROCEDURE add_job_hist 
    (p_emp_id  IN  employees.employee_id%TYPE, 
    p_new_jobid IN  jobs.job_id%TYPE) IS 
BEGIN 
    INSERT INTO job_history 
    SELECT employee_id, hire_date, SYSDATE, job_id, department_id 
    FROM employees 
    WHERE employee_id = p_emp_id; 

    UPDATE employees 
    SET hire_date = SYSDATE, 
     job_id = p_new_jobid, 
     salary = (SELECT min_salary + 500 
        FROM jobs 
        WHERE job_id = p_new_jobid) 
    WHERE employee_id = p_emp_id; 

    DBMS_OUTPUT.PUT_LINE('Added employee ' || p_emp_id || ' 
     details to the JOB_HISTORY table'); 
    DBMS_OUTPUT.PUT_LINE('Updated current job of employee ' || 
     p_emp_id|| 'to ' || p_new_jobid); 

EXCEPTION 
WHEN NO_DATA_FOUND THEN 
    RAISE_APPLICATION_ERROR (-20001, 'Employee does not exist!'); 
END add_job_hist; 
/

문제는이 성명 "INTO SELECT"아니라고, 그래서 언제 NO_DATA_FOUND 예외가 처리되지 않습니다. 내 자신의 사용자 정의 예외를 발생시킬 수 있지만 프로 시저에서이 작업을 수행하지 않는 것 같습니다. 이 문제를 해결하여 예외를 처리 할 수 ​​있습니까? 왜냐하면 지금 존재하지 않는 p_emp_id를 주면 어쨌든 그것을 처리하기 때문에 명령은 추가 프로 시저 변수를 원하지 않습니다.

감사합니다.

답변

4

insert 문 다음에 SQL % ROWCOUNT를 사용하여 확인하십시오. 0을 반환하면 no_data_found를 명시 적으로 발생 시키십시오.

CREATE OR REPLACE PROCEDURE add_job_hist(p_emp_id IN employees.employee_id%TYPE, 
             p_new_jobid IN jobs.job_id%TYPE) IS 
BEGIN 
    INSERT INTO job_history 
    SELECT employee_id, 
      hire_date, 
      SYSDATE, 
      job_id, 
      department_id 
     FROM employees 
    WHERE employee_id = p_emp_id; 
    IF SQL%ROWCOUNT = 0 THEN 
    RAISE no_data_found; 
    END IF; 
    UPDATE employees 
    SET hire_date = SYSDATE, 
     job_id = p_new_jobid, 
     salary = 
     (SELECT min_salary + 500 FROM jobs WHERE job_id = p_new_jobid) 
    WHERE employee_id = p_emp_id; 
    dbms_output.put_line('Added employee ' || p_emp_id || ' 
    details to the JOB_HISTORY table'); 
    dbms_output.put_line('Updated current job of employee ' || p_emp_id || 'to ' || p_new_jobid); 
EXCEPTION 
    WHEN no_data_found THEN 
    raise_application_error(-20001, 'Employee does not exist!'); 
END add_job_hist; 
/
+0

완벽합니다. 고맙습니다! (upvoted 및 답변으로 선택). 고맙습니다! -잭 – Munchy