PL/SQL 过程,在插入期间引发 no_data_found

Mun*_*chy 2 sql oracle plsql

这是我的 oracle 类中给我的代码:

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;
/
Run Code Online (Sandbox Code Playgroud)

问题是这不是“SELECT INTO”语句,因此不会处理 WHEN NO_DATA_FOUND 异常。我可以引发我自己的用户定义的异常,但它似乎不允许我在过程中执行此操作。我该如何解决这个问题以便它处理异常?因为现在,如果我给出一个不存在的 p_emp_id,它无论如何都会处理它,并且指令不需要任何额外的过程变量。

谢谢!

San*_*San 5

在插入语句后使用 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;
/
Run Code Online (Sandbox Code Playgroud)