---
title: "新建存储过程 | OceanBase 文档中心"
description: 新建存储过程 OceanBase 开发者中心（OceanBase Developer Center，ODC）支持可视化方式创建存储过程。本文介绍如何使用 ODC 创建存储过程。 概述 存储过程是一条或多条语句的集合，对数据库进行一系列复杂操作时，存储过程可以在数据库内将这类复杂操作封装成一个代码块，以便重复使用，从而…
---
切换语言

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

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*lqS5SYzz_YEAAAAAAAAAAAAADiGDAQ/original) 开发者中心 ODCV 4.0.0 企业版

# 新建存储过程

更新时间：2023-02-28 18:03:26

OceanBase 开发者中心（OceanBase Developer Center，ODC）支持可视化方式创建存储过程。本文介绍如何使用 ODC 创建存储过程。

## 概述

存储过程是一条或多条语句的集合，对数据库进行一系列复杂操作时，存储过程可以在数据库内将这类复杂操作封装成一个代码块，以便重复使用，从而减少数据库开发人员的工作量。

存储过程旨在完成特定功能的 SQL 语句集，经编译创建并保存在数据库中，用户可以通过指定存储过程名并指定所需参数来调用执行，利用存储过程可以加速 SQL 语句的执行。

新建存储过程，即由用户创建并能够完成某一特定功能的存储过程，存储过程可以包含参数和返回值。

### 存储过程与函数的区别

- 函数的返回值显示具体结果值，而存储过程的返回值仅指明执行是否成功。
 - 可以直接通过 `SELECT` 语句调用函数，而存储过程的调用需要使用 `CALL` 语句。

### 存储过程作用

- 提高应用程序的通用性和可移植性：新建存储过程完成后，可以在程序中被多次调用，无需重新编写该存储过程的 SQL 语句，且支持修改存储过程，对程序源代码无影响，从而提高程序的可移植性。
 - 提高 SQL 执行速度：存储过程编译完成，如果某一个操作包含大量的 SQL 代码或者分别被执行多次，则使用存储过程比直接使用单条 SQL 语句执行速度更快速。
 - 减轻服务器的负担：在进行数据库对象操作时，如果使用单条调用的方式，则网络上必须传输大量的 SQL 语句；如果使用存储过程，则可以直接发送过程的调用命令，从而降低网络负担。

![概述](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/odc/340/%E7%AE%A1%E7%90%86%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B-%E6%A6%82%E8%BF%B0.png)

如上图所示，创建存储过程包含以下 5 个步骤：

1. 输入存储过程名称。
 2. 添加参数。
 3. 确定新建存储过程信息。
 4. 编辑存储过程信息。
 5. 完成新建存储过程。

## 操作步骤

以在 ODC 中创建部门预算存储过程（proc_total）为例，存储过程 proc_total 中包含 budget_r 和 budget_s 两个 INT 类型的输入参数，计算两个参数之和。具体操作步骤如下：

### 步骤 1：指定存储过程名称

在 OceanBase 开发者中心（OceanBase Developer Center，ODC）单击连接名进入连接后，在左导航栏中单击 **存储过程** 标签可以查看存储过程列表。在存储过程列表的右上角，单击 **+** 创建存储过程，或是在顶部导航栏中单击 **新建** > **存储过程** 以创建所需的对象。

在 **新建存储过程** 中，输入存储过程名称。

![1](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/odc/333/%E6%96%B0%E5%BB%BA%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B-%E6%93%8D%E4%BD%9C%E6%AD%A5%E9%AA%A41.png)

### 步骤 2：添加参数

1. 参数即调用函数时传入的信息，需指定参数信息：

      - Oracle 模式：需指定参数的 **名称** 、 **模式** 、 **类型** 和 **默认值** **。**
      - MySQL 模式： 需指定参数的 **名称** 、 **模式** 、 **类型** 和 **长度** 。
 2. 添加函数提供三种功能操作：

   | 功能项 | 说明 |
   | --- | --- |
   | 弹窗引导辅助菜单 | 通过弹窗引导辅助菜单，可添加、删除、上下移动参数。 |
   | 单击表序号 | - 单击表序号，选中整行，显示辅助菜单（删除、上/下移动）。     - 单击并选中表序号，可拖动整行参数以调整顺序。 |
   | 鼠标右键操作 | 右键单击鼠标选中整行，进行复制行 / 向下移动一行。 | |

   > **说明**
   >
   >  
   >
   > 复制行后，可选中某行并通过快捷键 Command + V / Ctrl + V 进行粘贴。
 3. **参数** 中需指定的 **模式** 指参数类型

   MySQL 模式下不支持设定参数模式，Oracle 模式下支持三种参数模式 **IN** （输入）、 **OUT** （输出）、 **INOUT** （输入输出）：

   ```sql
   CREATE PROCEDURE proc_name ([[IN |OUT |INOUT ] parameter_name parameter_type...])

   ```

      - 参数说明

       | **参数** | **类型** |
       | --- | --- |
       | IN | 输入参数。    调用存储过程时将参数的值传入存储过程供执行存储过程时使用。 IN 类型参数一般只用于传入，在调用存储过程中一般不作修改和返回。 |
       | OUT | 输出参数。    调用存储过程时，存储过程会忽略输出参数本身的值并传入一个空值，执行结束后，输出参数会被赋予存储过程对其修改的值。一般用输出参数获取存储过程的执行结果数据。 OUT 类型参数可以用于调用存储过程中需要修改和返回值。 |
       | INOUT | 输入输出参数。    同时具备输入参数和输出参数的功能。 |
      - 参数设置

       | 属性 | 是否必填 | 默认 | 模式 |
       | --- | --- | --- | --- |
       | 名称 | 必填 | 空 | Oracle/MySQL |
       | 模式 | 必填 | IN | Oracle/MySQL |
       | 类型 | 必填 | VARCHAR | Oracle/MySQL |
       | 长度 | 必填 | 45 | MySQL |
       | 默认值 | 非必填 | 空 | Oracle |

### 步骤 3：确定新建存储过程

单击 **确定** ，进入 SQL 创建确认页面。

### 步骤 4：编辑存储过程

![4](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/odc/340/%E6%96%B0%E5%BB%BA%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B-4.png)

在 SQL 创建确认页面 ，编辑存储过程语句。

同时，在编辑页面的工具栏中提供了以下功能键：

| 功能 | 说明 |
| --- | --- |
| 格式化 | 单击该按钮对选中的 SQL 语句或当前 SQL 窗口中的所有 SQL 语句进行统一的格式化（缩进、换行和高亮关键字等操作）。 |
| 查找/替换 | 在查找框内输入内容以对脚本进行检索，查找后可在替换框内输入内容以对查找内容进行替换。 |
| 撤销 | 将脚本回退到上一步操作执行的结果。 |
| 重做 | 执行 **撤销** 操作后，对脚本重新执行撤销前的操作。 |
| 大小写 | 提供 **全部大写** 、 **全部小写** 和 **首字母大写** 三种效果，为脚本中选中的语句转换为对应形式。 |
| 缩进 | 提供 **添加缩进** 和 **删除缩进** 两种效果，为脚本中选中的语句添加或删除包含的缩进。 |
| 注释 | 提供 **添加注释** 和 **删除注释** 两种效果，为脚本中选中的语句转换为注释或转换为 SQL 语句。 |
| IN 值转化 | 可以将如 A B 的格式转化为 ('A','B') 的格式。 |

用户可以在 SQL 创建确认页面编辑创建的存储过程语句。语法格式如下：

```sql
CREATE PROCEDURE proc_name (
  [proc_parameter[,...]])
BEGIN
proc_body:
　　Valid SQL routine statement
END [end_label]

```

参数说明：

| 参数 | 说明 |
| --- | --- |
| proc_name | 存储过程的名称，默认在当前数据库中创建。 如需在特定数据库中创建存储过程，需要在名称前加上数据库名称，即 db_name.sp_name。   **注意**    名称应当尽量避免选取与 MySQL 内置函数相同的名称，否则会发生错误。 |
| [proc_parameter[,…] ] | 存储过程的参数列表，包括 `[IN\|OUT\|INOUT] parameter_name parameter_type`。    其中，`parameter_name` 为参数名，`parameter_type` 为参数的类型（可以是任何有效的 MySQL 数据类型）。当有多个参数时，参数列表中彼此间用逗号分隔。存储过程可以无参数（此时存储过程的名称后仍需加上一对括号），也可以有 1 个或多个参数。   **注意**    参数名避免与数据表的列名相同，否则存储过程的 SQL 语句会将参数名看作列名，从而可能出错。 |
| proc_body | 存储过程的主体部分，包含在过程调用的时候必须执行的 SQL 语句。    此部分以 **BEGIN** 开始， **END** 结束。如存储过程体中只有一条 SQL 语句，则可以省略 BEGIN-END 标志。 |

### 步骤 5：完成新建存储过程

单击 **创建** ，完成新建存储过程后，可以如同调用系统内置函数一样，使用 `CALL` 语句调用用户自定义的存储过程。

![5.1](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/odc/340/%E6%96%B0%E5%BB%BA%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B-5.1.png)

> **说明**
>  在左侧导航栏中，右键鼠标单击存储过程列表中的存储过程名，通过弹出的管理操作列表（包括 **查看** 、 **新建** 、 **编辑** 、 **运行** 、 **下载** 、 **删除** 和 **刷新** 等），可快速管理和操作目标对象。

存储过程具体操作，请参见 [管理存储过程](https://www.oceanbase.com/docs/enterprise-odc-doc-cn-10000000000834089)。

语法格式：

```sql
CALL proc_name ([proc_parameter [,...]]);

```

示例：

```sql
CALL proc_total (30000, 20000);

```

![5.2](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/odc/340/%E6%96%B0%E5%BB%BA%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B-5.2.png)

## 相关信息

- [新建表](https://www.oceanbase.com/docs/enterprise-odc-doc-cn-10000000000833883)
 - [新建视图](https://www.oceanbase.com/docs/enterprise-odc-doc-cn-10000000000833880)
 - [新建函数](https://www.oceanbase.com/docs/enterprise-odc-doc-cn-10000000000833877)
 - [新建序列](https://www.oceanbase.com/docs/enterprise-odc-doc-cn-10000000000833891)
 - [新建程序包](https://www.oceanbase.com/docs/enterprise-odc-doc-cn-10000000000833874)
 - [新建触发器](https://www.oceanbase.com/docs/enterprise-odc-doc-cn-10000000000833871)
 - [新建类型](https://www.oceanbase.com/docs/enterprise-odc-doc-cn-10000000000834091)
 - [新建同义词](https://www.oceanbase.com/docs/enterprise-odc-doc-cn-10000000000833888)

 上一篇 下一篇 ![有帮助](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) 咨询热线
