基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
创建存储过程失败,不支持预定义异常
更新时间:2024-01-22 01:56
OceanBase 数据库存储过程中的 DUP_VAL_ON_INDEX 需要自定义异常。本文介绍了自定义异常的方法。
适用版本
OceanBase 数据库 V2.2.72 前的版本
问题现象
创建存储过程失败,错误信息如下。
obclient> CREATE OR REPLACE PROCEDURE p1
(
c1 VARCHAR,
c2 IN SMALLINT,
ret IN OUT SMALLINT
)
AS
BEGIN
DELETE FROM t1 WHERE t1.c2=c2 AND t1.c1=c1;
INSERT INTO t1(t1.c1,c3,t1.c2) VALUES(c1,sysdate,c2);
ret:=0;
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
ret:=1;
RETURN;
END;/
Undefined CONDITION: DUP_VAL_ON_INDEX
可能原因
OceanBase 数据库 V2.2.72 前的版本中,存储过程中的 DUP_VAL_ON_INDEX 需要自定义异常。
OceanBase 数据库有一些预定义异常,会在程序违反数据库规则或者超出系统依赖限制时自动抛出。例如,如果 SELECT INTO 语句没有返回数据行,OceanBase 数据库会上报一个预定义异常 NO_DATA_FOUND。
解决方式
有两种方式可以解决该问题。
将 OceanBase 数据库升级到 V2.2.72 或之后版本。
自定义异常。
OceanBase 数据库支持自定义异常。异常声明的语法格式如下。
exception_name EXCEPTION;不同于预定义异常,用户自定义的异常在条件触发时必须显式的上报。方法是使用
RAISE语句或者使用RAISE_APPLICATION_ERROR方法。例如:IF condition THEN RAISE exception_name;子程序的异常处理部分包含一个或多个异常处理程序。一个异常处理程序的语法格式如下。
WHEN { exception_name [ OR exception_name ]... | OTHERS } THEN statement; [ statement; ]...