No_data_found 异常处理

Posted

技术标签:

【中文标题】No_data_found 异常处理【英文标题】:No_data_found Exception handling 【发布时间】:2015-03-23 05:28:04 【问题描述】:
PROCEDURE getEmployeeDetails(EmpID     IN NUMBER,
                             EmpSalary OUT NUMBER) Is
  BEGIN

    SELECT Salary
      into EmpSalary
      FROM Employee_accounts_master
     WHERE Emp_ID = EmpID
       AND SALARY = 'B';

  EXCEPTION
    WHEN NO_DATA_FOUND THEN

      dbms_output.put_line(-20001);

当上述查询未获取任何行时,此过程将引发 NO_DATA_FOUND 异常。我需要做一些其他的更新/插入过程,而不是抛出这个异常。如何实现这一点。

【问题讨论】:

重命名此过程可能是可取的,它的名称(“获取员工详细信息”)意味着它不会对数据库进行任何更改。 【参考方案1】:

测试记录是否存在是显式游标有用的一个实例。

PROCEDURE getEmployeeDetails(EmpID     IN NUMBER,
                             EmpSalary OUT NUMBER) 
IS
     cursor c_emp (p_EmpID NUMBER) is
        SELECT Salary
          FROM Employee_accounts_master 
         WHERE Emp_ID = p_EmpID
           AND SALARY = 'B';
     r_Emp c_emp%rowtype;
BEGIN
        open c_emp(EmpID);
        fetch c_emp into r_emp;
        if c_emp%NOTFOUND then
            insert into employee (emp_id) values (EmpID);
        end if;
        close c_emp;
  END;

您也可以使用 MERGE 语句,但只需编写一个 WHEN NOT MATCHED THEN INSERT 分支。 Find out more。

【讨论】:

【参考方案2】:

只需在异常部分执行,检查以下内容:

Begin
BEGIN

        SELECT Salary
          into EmpSalary
          FROM Employee_accounts_master
         WHERE Emp_ID = EmpID
           AND SALARY = 'B';

      EXCEPTION
        WHEN NO_DATA_FOUND THEN
         -- use the label
           goto myinsert;
     end;
    -- here is your line 67 code starts
   <<myinsert>>
    -- your insert statement, for eg.
    insert into emp (empno) values (1);
 end;

【讨论】:

是否可以将执行定向到包含所有数据的另一行。假设我在第 67 行有一个插入操作。当 NO_DATA_FOUND 被抛出时,是否可以将执行转移到第 67 行? 为什么要把label当做标识符,让我声明呢?? 你有没有把 > 放在第 67 行之前? 这种方法的问题是,如果找到该行,代码也会尝试插入。那是不可取的。 虽然我对 GOTO 的态度比大多数人都轻松,但它仍然被普遍认为是不好的做法,除非绝对必要,否则应避免使用。这不是那些罕见的情况之一。

以上是关于No_data_found 异常处理的主要内容,如果未能解决你的问题,请参考以下文章

No_data_found 异常也传播到外部块?

Oracle SQL 异常处理

Oracle 嵌套块和异常处理

如何以不同的方式处理 PL/SQL 中的不同异常?

PL SQL 过程不引发异常 no_data_found

oracle 中的 No_Data_found 异常