Oracle PL / SQL过程更新表-异常处理

时间:2019-01-15 21:06:56

标签: oracle plsql exception-handling

这是我对PL / SQL的第一个查询,无论如何,我确实花了一个小时试图在网上找到答案。

我正在编写一个更新表的过程,并且一切正常,但是,当我键入更新不存在的job_id时,我希望我的异常处理能告诉我{{ 1}}无效,但是没有收到错误消息。

我的代码如下:

job_id

然后我尝试通过键入以下内容来更新我不知道的job_id,以查看异常是否有效

CREATE OR REPLACE PROCEDURE UPD_JOB(p_job_id jobs.job_id%TYPE, p_jobnew jobs.job_title%TYPE)
IS
BEGIN
UPDATE JOBS SET job_title =p_jobnew WHERE JOB_ID = p_job_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No rows have been updated');
END;
/

1 个答案:

答案 0 :(得分:2)

来自"Handling PL/SQL Errors"

  

NO_DATA_FOUND

     

SELECT INTO语句不返回任何行,或者您的程序引用嵌套表中的已删除元素或索引表中的未初始化元素。 SQL聚合函数(例如AVG和SUM)始终返回值或null。因此,调用聚合函数的SELECT INTO语句永远不会引发NO_DATA_FOUND。预计FETCH语句最终将不返回任何行,因此,在发生这种情况时,不会引发任何异常。

您使用的语句不会引发NO_DATA_FOUND异常。

也许您可以使用SQL%ROWCOUNT。来自"Performing SQL Operations from PL/SQL"

  

要了解DML语句影响多少行,可以检查SQL%ROWCOUNT ...的值。

CREATE OR REPLACE PROCEDURE UPD_JOB (p_job_id jobs.job_id%TYPE,
                                     p_jobnew jobs.job_title%TYPE)
IS
BEGIN
  UPDATE JOBS
         SET job_title = p_jobnew
         WHERE JOB_ID = p_job_id;

  IF SQL%ROWCOUNT = 0 THEN
    DBMS_OUTPUT.PUT_LINE('No rows have been updated');
  END IF;
END;
/