---
title: 创建存储过程失败，不支持预定义异常 -OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于创建存储过程失败，不支持预定义异常 相关的常见问题和使用技巧，帮助您快速解决创建存储过程失败，不支持预定义异常 的难题。
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# 创建存储过程失败，不支持预定义异常

更新时间：2024-01-22 01:56

适用版本： V2.2.x 内容类型：Troubleshoot  

OceanBase 数据库存储过程中的 DUP_VAL_ON_INDEX 需要自定义异常。本文介绍了自定义异常的方法。

## 适用版本

OceanBase 数据库 V2.2.72 前的版本

## 问题现象

创建存储过程失败，错误信息如下。

```unknow
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 数据库支持自定义异常。异常声明的语法格式如下。

  ```unknow
  exception_name EXCEPTION;

  ```

  不同于预定义异常，用户自定义的异常在条件触发时必须显式的上报。方法是使用 `RAISE` 语句或者使用 `RAISE_APPLICATION_ERROR` 方法。例如：

  ```unknow
  IF condition THEN RAISE exception_name;

  ```

  子程序的异常处理部分包含一个或多个异常处理程序。一个异常处理程序的语法格式如下。

  ```unknow
  WHEN { exception_name [ OR exception_name ]... | OTHERS } THEN
  statement; [ statement; ]...

  ```

Previous

[OceanBase 数据库 Oracle 模式查看各类对象上次编译的错误信息](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000209958)

Next

[内含 truncate 操作的存储过程执行时间不稳定的原因](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000209965) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
