人大金仓数据库KingbaseES PLSQL异常处理程序

关键字:

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;

  1. 通常,exception一般声明在你的plsql块的最后方,因为exception只能捕获在其声明语句前的异常。
  2. 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;

/

\set SQLTERM ;

  1. 使用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;

参考资料

《KingbaseES产品手册》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值