Plsql 未找到异常处理的\u数据\u

Plsql 未找到异常处理的\u数据\u,plsql,oracle10g,oracle-sqldeveloper,Plsql,Oracle10g,Oracle Sqldeveloper,当上述查询未获取任何行时,此过程将抛出“未找到数据”异常。我需要做一些其他的更新/插入过程,而不是抛出这个异常。如何做到这一点 只需在例外部分执行,检查以下内容: PROCEDURE getEmployeeDetails(EmpID IN NUMBER, EmpSalary OUT NUMBER) Is BEGIN SELECT Salary into EmpSalary FROM Emplo

当上述查询未获取任何行时,此过程将抛出“未找到数据”异常。我需要做一些其他的更新/插入过程,而不是抛出这个异常。如何做到这一点

只需在例外部分执行,检查以下内容:

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);

测试记录的存在性是显式游标非常有用的一个实例

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;

或者,您可以使用MERGE语句,但只需在不匹配时编码一个分支,然后插入分支

是否有可能将执行指向包含所有数据的另一行。假设我在第67行有一个插入操作。当找不到数据时,是否可以将执行转移到第67行?为什么它将标签作为标识符并要求我声明它?是否将标签放在第67行之前?这种方法的问题是,如果找到行,代码也会尝试插入。这是不可取的。虽然我比大多数人都更放松,但它仍然被普遍认为是不好的做法,除非绝对必要,否则应该避免。这不是罕见的情况之一。重命名此过程可能是可取的,它的名称get employee details意味着它不会更改数据库。
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;