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
是检查受影响行数的方法。