关键字:
exception、异常捕获、人大金仓、KingbaseES
异常处理程序的原理及作用?
在KingbaseES中,可以通过异常处理机制来捕获和处理数据库操作过程中可能发生的异常或错误。异常处理的原理是在你的代码中设置一个异常块,当异常发生时,控制流会跳转到对应的异常块中,然后你可以在异常块中执行相应的处理逻辑。
如果没有发生异常,plsql块只是简单地执行所有 Statements ,然后转到 END 之后的下一个语句。但是 如果在 Statements 内发生了一个错误,则会放弃对 Statements 的进一步处理,然后转到异常处理程序。 系统会在异常条件列表中匹配当前触发的异常。如果匹配成功,则执行对应的 HandlerStatements ,执行完成 后转到 END 之后的下一个语句。如果匹配失败,则该异常就会传播出去,就像没有 异常处理程序一样。 异常可以被外层闭合块中的处理程序捕获,如果没有异常处理程序则中止该程序的执行。
Exception语法介绍
语法树:
[ DECLARE
[ < VariableDeclaration > ]
[ < CursorDeclaration > ]
[ < UserDefinedExceptionDeclaration > ] ]
BEGIN
< Statements >
EXCEPTION
WHEN ExceptionName [ OR ExceptionName... ]
THEN < HandlerStatements >;
[ WHEN ExceptionName[ OR ExceptionName... ] THEN < HandlerStatements >;
END;
- 通常,exception一般声明在你的plsql块的最后方,因为exception只能捕获在其声明语句前的异常。
- ExceptionName,异常的名称,系统预先定义或用户自定义异常,直接使用即可,异常名称大小写均可,如 division_by_zero ,表示发生” 除零” 错误。异常名是与大小写无关的,一个异常名也可以通过 SQLSTATE 代码 指定,例如以下是等价的:
WHEN division_by_zero THEN ...
WHEN SQLSTATE '22012' THEN ...
Exception语句使用示例
\set SQLTERM /
CREATE OR REPLACE PROCEDURE PROC() AS
x int := 1;
BEGIN
x := x / 0;
EXCEPTION
WHEN division_by_zero THEN
RAISE NOTICE 'caught division_by_zero';
END;
/
- 使用exception语句的注意事项
1.如果在选中的 HandlerStatements 内触发新的异常,那么它不能被当前这个 EXCEPTION 子句捕获,而是被传 播出去。由外层的 EXCEPTION 子句捕获它。
2. 当一个异常被 EXCEPTION 子句捕获时,PL/SQL 函数的局部变量会保持异常触发时的值,但是该块中所有对数据库状态的改变都会被回滚。如下方示例所示:
DROP TABLE IF EXISTS mytab CASCADE;
CREATE TABLE mytab(firstname TEXT, lastname TEXT);
INSERT INTO mytab(firstname, lastname) VALUES('Tom', 'Jones');
\set SQLTERM /
CREATE OR REPLACE PROCEDURE PROC() AS
x int := 1;
BEGIN
UPDATE mytab SET firstname = 'Joe' WHERE lastname = 'Jones';
x := x / 0;
EXCEPTION
WHEN division_by_zero THEN
RAISE NOTICE 'caught division_by_zero';
END;
/
\set SQLTERM ;
CALL PROC();
--查询更改:
SELECT * FROM mytab;