首页 > 解决方案 > PL/SQL 异常未捕获异常

问题描述

你们能帮我理解为什么我的代码不处理异常而是给出错误。

SQL> SET SERVEROUTPUT ON

DEFINE p_salary

DECLARE
v_fname employees.first_name%TYPE;
v_lname employees.last_name%TYPE;
v_salary employees.salary%TYPE := &p_salary;

BEGIN
SELECT first_name, last_name
INTO v_fname, v_lname
FROM employees
WHERE salary = v_salary;

INSERT INTO messages(results)
VALUES(v_fname || ' ' 
               || v_lname 
               || ' is the only employee with the salary of '
               || v_salary);

EXCEPTION
WHEN TOO_MANY_ROWS THEN
    INSERT INTO messages(results)
    VALUES('More than one employee with a salary of ' || v_salary);

WHEN NO_DATA_FOUND THEN
    INSERT INTO messages(results) 
    VALUES('No employee with the salary of ' || v_salary);

WHEN OTHERS THEN
    INSERT INTO messages(results)
    VALUES('Some other error occurred.');

END;
/SQL> SQL> SP2-0135: symbol p_salary is UNDEFINED
SQL> SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14   
15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   
31   32  
Enter value for p_salary: 6000
old   4:     v_salary employees.salary%TYPE := &p_salary;
new   4:     v_salary employees.salary%TYPE := 6000;
DECLARE
*
ERROR at line 1:
ORA-01722: invalid number
ORA-06512: at line 20
ORA-01422: exact fetch returns more than requested number of rows

该错误是我放入异常块中的内容,但仍未被捕获。

标签: oracleplsql

解决方案


您似乎正在尝试将日志消息插入到只接受数字的表的列中。

exact fetch returns more than requested number of rows异常被捕获,但在处理原始异常时引发了另一个异常,所以看起来它们都被一起引发了。

您没有给出messages表的定义,但如果我使用create table messages (results number);.

您将需要(a)将results列的类型更改为,例如,VARCHAR2(4000)使用类似

alter table messages modify results varchar2(4000);

或 (b) 在此表中使用不同的列。


推荐阅读