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; ]…