oracle - 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
该错误是我放入异常块中的内容,但仍未被捕获。
解决方案
您似乎正在尝试将日志消息插入到只接受数字的表的列中。
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) 在此表中使用不同的列。
推荐阅读
- javascript - p5js 上的特定闪烁
- mysql - 喜欢的帖子设计细节
- api - 当提供支持多个 API 规范的预生成链接时,Swagger UI 不会加载规范
- ios - 如果我更新 UItextView - Swift,UIView.animate 不起作用
- html - 如何在 Angular 8 的 ngx-datatable 的列中添加按钮?
- opencv - 双边滤波器函数中直径和西格玛参数的数学关系是什么?
- mysql - 使用 Google Apps 脚本将 Null 值从表格插入 Mysql 数据库
- c++ - 构建 OpenCV 时出现编译错误 (cap_avfoundation_mac)
- ruby-on-rails - 提交表单时出现 Rails 验证问题
- c++ - 在析构函数中删除单链表的正确方法是什么?