更新日期:2024年09月11日
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 328 -
您可使用 RAISE EXCEPTION 语句生成您自己的错误,如下图所示。
图: RAISE EXCEPTION 语句。
BEGIN
ON EXCEPTION SET esql, eisam -- 捕获所有错误
IF esql = -206 THEN -- 未找到表
-- 某种恢复
ELSE
RAISE exception esql, eisam; -- 放过该错误
END IF
END EXCEPTION
-- 执行某操作
END
在该示例中,ON EXCEPTION 语句使用两个变量 esql 和 eisam,来保存数据库服务器返回
的错误编号。如果发生错误且如果 SQL 错误编号为 -206,则执行 IF 子句。如果捕获任
何其他 SQL 错误,则将它从此 BEGINEND 块传至前面的示例的最后 BEGINEND 块。
模拟 SQL 错误
您可产生错误来模拟 SQL 错误,如下图所示。如果用户为 pault, 则 SPL 运行如同那个
用户没有 update 权限一样,即使该用户实际确实拥有那个权限。
图: 模拟 SQL 错误。
BEGIN
IF user = 'pault' THEN
RAISE EXCEPTION -273; -- 拒绝 Paul 的 update 权限
END IF
END
使用 RAISE EXCEPTION 来退出嵌套的代码
下图展示您可如何使用 RAISE EXCEPTION 语句来退出深度嵌套的块。
图: RAISE EXCEPTION 语句。
BEGIN
ON EXCEPTION IN (1)
END EXCEPTION WITH RESUME -- do nothing significant (cont)
BEGIN
GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 329 -
FOR i IN (1 TO 1000)
FOREACH select ..INTO aa FROM t
IF aa < 0 THEN
RAISE EXCEPTION 1; -- emergency exit
END IF
END FOREACH
END FOR
RETURN 1;
END
--do something; -- emergency exit to
-- this statement.
TRACE 'Negative value returned';
RETURN -10;
END
如果最内层的条件为真(如果 aa 为负),则发生异常,且执行跳至跟在该块的 END 之后
的代码。在此情况下,执行跳至 TRACE 语句。
请记住,BEGINEND 块为单个语句。如果在块中的某处发生错误,且在该块之外捕获,则
当执行恢复时,跳过该块剩余的部分,并从下一语句开始执行。
除非您在该块的某处为此错误设置捕获,否则,将错误条件传回至包含该调用的块,并传
回至包含该块的任何块。如果不存在设置处理该错误的 ON EXCEPTION 语句,则停止该
SPL 例程的执行,为正在执行该 SPL 例程的例程创建一个错误。