创建存储过程失败,不支持预定义异常怎么办?

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