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 异常处理的主要内容,如果未能解决你的问题,请参考以下文章