Plsql 为什么此代码中的RAISE\u APPLICATION\u ERROR()函数不起作用?

Plsql 为什么此代码中的RAISE\u APPLICATION\u ERROR()函数不起作用?,plsql,Plsql,我想在查询未获取任何记录时抛出自定义错误。但是下面的代码没有抛出我想要的错误。它是抛出系统生成的一个错误。你能帮帮我吗?我犯了什么错误 DECLARE v_em_id NUMBER := &var_id; v_name varchar2(20); BEGIN SELECT first_name INTO v_name FROM employees WHERE employee_id =v_em_id; IF SQL%NOTFOUND THEN RAISE_APPLICATION_ERRO

我想在查询未获取任何记录时抛出自定义错误。但是下面的代码没有抛出我想要的错误。它是抛出系统生成的一个错误。你能帮帮我吗?我犯了什么错误

DECLARE
v_em_id NUMBER := &var_id;
v_name varchar2(20);
BEGIN
SELECT first_name INTO v_name FROM employees WHERE employee_id =v_em_id;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20002,'Employee not exist');
END IF;
DBMS_OUTPUT.PUT_LINE('Hi! '|| v_name);
END;
我应该抛出错误代码:-20002
和错误消息:员工不存在。

您可以尝试以下代码

DECLARE
  v_em_id NUMBER := &var_id;
  v_name  varchar2(20);
BEGIN

  SELECT first_name INTO v_name FROM employees WHERE employee_id = v_em_id;

  DBMS_OUTPUT.PUT_LINE('Hi! ' || v_name);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    IF SQL%NOTFOUND THEN
      RAISE_APPLICATION_ERROR(-20002, 'Employee not exist');
    END IF;
END;

如果
select
语句未返回任何行,它将引发
no\u data\u found
异常。因此,系统在
之前发生故障,如果未找到SQL%,则

您可以尝试以下代码

DECLARE
  v_em_id NUMBER := &var_id;
  v_name  varchar2(20);
BEGIN

  SELECT first_name INTO v_name FROM employees WHERE employee_id = v_em_id;

  DBMS_OUTPUT.PUT_LINE('Hi! ' || v_name);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    IF SQL%NOTFOUND THEN
      RAISE_APPLICATION_ERROR(-20002, 'Employee not exist');
    END IF;
END;

如果
select
语句未返回任何行,它将引发
no\u data\u found
异常。因此,系统在
之前发生故障,如果未找到SQL%,则

SQL%NOTFOUND
在这里是无用的。如果未找到任何内容,则会引发
未找到任何数据
异常,因此您必须处理该异常。下面是一个基于Scott模式的示例:

SQL> declare
  2    v_em_id number := &empno;
  3    v_name  varchar2(20);
  4  begin
  5    select ename
  6      into v_name
  7      from emp
  8      where empno = v_em_id;
  9
 10    dbms_output.put_line('Hi, ' || v_name);
 11  exception
 12    when no_data_found then
 13      raise_application_error(-20002, 'Employee does not exist');
 14  end;
 15  /
Enter value for empno: 7934
Hi, MILLER

PL/SQL procedure successfully completed.

SQL> /
Enter value for empno: 111
declare
*
ERROR at line 1:
ORA-20002: Employee does not exist
ORA-06512: at line 13


SQL>

SQL%NOTFOUND
在这里是无用的。如果未找到任何内容,则会引发
未找到任何数据
异常,因此您必须处理该异常。下面是一个基于Scott模式的示例:

SQL> declare
  2    v_em_id number := &empno;
  3    v_name  varchar2(20);
  4  begin
  5    select ename
  6      into v_name
  7      from emp
  8      where empno = v_em_id;
  9
 10    dbms_output.put_line('Hi, ' || v_name);
 11  exception
 12    when no_data_found then
 13      raise_application_error(-20002, 'Employee does not exist');
 14  end;
 15  /
Enter value for empno: 7934
Hi, MILLER

PL/SQL procedure successfully completed.

SQL> /
Enter value for empno: 111
declare
*
ERROR at line 1:
ORA-20002: Employee does not exist
ORA-06512: at line 13


SQL>

您可以添加正在抛出的错误吗?@bogertron可能是一个未处理的
未找到数据
,因为它缺少异常处理程序。您可以添加正在抛出的错误吗?@bogertron可能是一个未处理的
未找到数据
,因为它缺少异常处理程序。为什么要添加一个异常处理程序重复答案,发布相同答案3小时后?为什么在发布相同答案3小时后添加重复答案?应该补充的是,这是由
into
子句引起的,该子句要求查询只返回一行。在各种其他情况下(如执行更新或插入选择),您不会遇到此异常,
sql%rowcount
是检查受影响行数的方法。应该补充的是,这是由
into
子句引起的,该子句要求查询只返回一行。在其他各种情况下(如执行更新或插入选择),您不会遇到此异常,
sql%rowcount
是检查受影响行数的方法。