引言
KingbaseES 凭借其与 Oracle PL/SQL 高兼容度,成为关键行业数据库迁移的首选。然而在实际迁移过程中,开发者常遇到相同的 PL/SQL 代码在 Oracle 运行正常,在 KingbaseES 却报错的困惑。

本文梳理 KingbaseES 异常处理机制,从语法差异到运行时错误的完整解决方案。
一、异常处理机制
异常(PL/SQL 运行时错误)可能来自设计错误、编码错误、硬件故障或其他来源。无法预先处理所有可能触发的异常,但可以编写异常处理程序,让程序在触发异常的情况下继续运行。
1.1 异常处理原理
KingbaseES 三级异常处理架构
- 语法解析:通过扩展的 SQL 解析器识别 Oracle PL/SQL 特有语法
- 语义逻辑:将 Oracle 语义规则映射为 KingbaseES 执行逻辑
- 函数映射:内置同名函数实现无缝替换
当执行到错误语句时,控制流会跳转到对应的 EXCEPTION 块。系统在异常条件列表中匹配当前触发的异常,若匹配成功则执行对应的 HandlerStatements,否则异常会向外层传播直至被捕获或终止程序。
1.2 封闭块
异常处理程序运行后,控制权转移到封闭块的下一条语句。如果没有封闭块会出现下面的情况
如果异常处理程序在子程序中,则将控制权返回给调用者调用之后的语句处 如果异常处理程序位于匿名块中,则控制权转移到主机环境
如果在没有异常处理程序的 PL/SQL 块中触发异常,则异常会传播。也就是说,异常会在连续的封闭块中向上抛出,直到一个 PL/SQL 块有一个异常处理程序或没有封闭块为止,如果没有异常处理程序,那么 PL/SQL 会向调用者或主机环境返回一个未处理的异常,这将决定最终的返回结果。
1.3 异常种类
KingbaseES 异常的种类分为:
系统预定义异常
系统预定义异常是 PL/SQL 已命名的异常,这些异常都有一个错误代码,且会在系统运行出错时隐式(自动)触发。
用户自定义异常
可以在任何 PL/SQL 匿名块、子程序或包的声明部分中声明自己的异常。例如,可以声明一个名为 invalid_number 的异常标记一个无效数字。用户自定义异常必须显式的触发。
异常差异

下面将详细讲解两种异常。
1.4 异常处理程序的优点
使用异常处理程序进行异常处理使程序更易于编写和理解,并降低了未处理异常的可能性。
如果没有异常处理程序,则必须检查所有可能触发的异常,并处理它。但这样很容易忽略可能出现的异常,尤其是在无法立即检测到异常的情况下(例如,在计算运行之前使用了错误数据可能无法检测到)。异常处理代码可以分散在整个程序中。
使用异常处理程序,不需要预先知道每个可能触发的异常或它可能发生的位置。只需在可能发生错误的每个块中包含一个异常处理模块。在异常处理模块中,用户可以编写处理特定错误或未知错误的异常处理程序。如果块中的任何地方(包括子块内)发生错误,则异常处理程序都会捕获并处理它。错误处理代码则会被隔离在块的异常处理部分。
一个存储过程使用单个异常处理程序来处理预定义异常 NO_DATA_FOUND,该异常可以出现在两个 SELECT INTO 语句中的任何一个中。
如果多个语句使用相同的异常处理程序,并且用户想知道哪个语句触发了异常,则可以使用变量辅助定位。
如果用户可以确定需要处理哪个异常,就可以为特定异常设置一个异常处理程序。用户还可以通过将语句放入具有自己的异常处理程序的块中来检查单个语句中的异常。



