概述
存储过程是一条或多条语句的集合,对数据库进行一系列复杂操作时,存储过程可以在数据库内将这类复杂操作封装成一个代码块,以便重复使用,从而减少数据库开发人员的工作量。
存储过程旨在完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户可以通过指定存储过程名并指定所需参数来调用执行,利用存储过程可以加速 SQL 语句的执行。
新建存储过程,即由用户创建并能够完成某一特定功能的存储过程,存储过程可以包含参数和返回值。
存储过程与函数的区别
函数的返回值显示具体结果值,而存储过程的返回值仅指明执行是否成功。
可以直接通过
SELECT
语句调用函数,而存储过程的调用需要使用CALL
语句。
存储过程作用
提高应用程序的通用性和可移植性:新建存储过程完成后,可以在程序中被多次调用,无需重新编写该存储过程的 SQL 语句,且支持修改存储过程,对程序源代码无影响,从而提高程序的可移植性。
提高 SQL 执行速度:存储过程编译完成,如果某一个操作包含大量的 SQL 代码或者分别被执行多次,则使用存储过程比直接使用单条 SQL 语句执行速度更快速。
减轻服务器的负担:在进行数据库对象操作时,如果使用单条调用的方式,则网络上必须传输大量的 SQL 语句;如果使用存储过程,则可以直接发送过程的调用命令,从而降低网络负担。
如上图所示,创建存储过程包含以下 5 个步骤:
本文档以在 ODC 中创建部门预算存储过程(proc_total)为例,存储过程 proc_total 中包含 budget_r 和 budget_s 两个 INT 类型的输入参数,计算两个参数之和。
文中所使用的均为示例数据,您可根据实际情况对数据进行替换。
操作步骤
步骤一:指定存储过程名称
在 OceanBase 开发者中心(OceanBase Developer Center,ODC)单击连接名进入连接后,在左导航栏中单击 存储过程 标签可以查看存储过程列表。在存储过程列表的右上角,单击+创建存储过程,或是在顶部导航栏中单击 新建> 存储过程 以创建所需的对象。
在 新建存储过程 中,输入存储过程名称。
步骤二:添加参数
参数即调用函数时传入的信息,需指定参数信息:
Oracle 模式:需指定参数的 名称、模式、类型和 默认值。
MySQL 模式: 需指定参数的 名称、模式、类型和 长度。
添加函数提供三种功能操作:
功能项
说明
弹窗引导辅助菜单
通过弹窗引导辅助菜单,可添加、删除、上下移动参数。
单击表序号
单击表序号,选中整行,显示辅助菜单(删除、上/下移动)。
单击并选中表序号,可拖动整行参数以调整顺序。
右键操作
拖动鼠标选中整行,右键单击鼠标,进行复制行 / 向下移动一行。
选择单元格,右键单击鼠标,进行复制。
参数中需指定的 模式指参数类型
MySQL/Oracle 模式下支持三种参数模式 IN(输入)、OUT(输出)、INOUT(输入输出):
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
步骤三:确定新建存储过程
步骤四:编辑存储过程
在 SQL 创建确认页面 ,编辑存储过程语句。
同时,在编辑页面的工具栏中提供了以下功能键:
功能 | 说明 |
格式化 | 单击该按钮对选中的 SQL 语句或当前 SQL 窗口中的所有 SQL 语句进行统一的格式化(缩进、换行和高亮关键字等操作)。 |
查找/替换 | 在查找框内输入内容以对脚本进行检索,查找后可在替换框内输入内容以对查找内容进行替换。 |
撤销 | 将脚本回退到上一步操作执行的结果。 |
重做 | 执行 撤销操作后,对脚本重新执行撤销前的操作。 |
大小写 | 提供全部大写、全部小写和 首字母大写三种效果,为脚本中选中的语句转换为对应形式。 |
缩进 | 提供 添加缩进和 删除缩进两种效果,为脚本中选中的语句添加或删除包含的缩进。 |
注释 | 提供 添加注释和 删除注释两种效果,将脚本中选中的语句转换为注释或转换为 SQL 语句。 |
IN 值转化 | 可以将如 A B 的格式转化为 ('A','B') 的格式。 |
用户可以在 SQL 创建确认页面编辑创建的存储过程语句。语法格式如下:
CREATE PROCEDURE proc_name (
[proc_parameter[,...]])
IS
BEGIN
proc_body:
Valid SQL routine statement
END [end_label]
参数说明:
参数 | 说明 |
proc_name | 存储过程的名称,默认在当前数据库中创建。 如需在特定数据库中创建存储过程,需要在名称前加上数据库名称,即 db_name.sp_name。 重要 名称应当尽量避免选取与 MySQL 内置函数相同的名称,否则会发生错误。 |
[proc_parameter[,…] ] | 存储过程的参数列表,包括 其中, 重要 参数名避免与数据表的列名相同,否则存储过程的 SQL 语句会将参数名看作列名,从而可能出错。 |
proc_body | 存储过程的主体部分,包含在过程调用的时候必须执行的 SQL 语句。 此部分以 BEGIN开始,END 结束。如存储过程体中只有一条 SQL 语句,则可以省略 BEGIN-END 标志。 |
步骤五:完成新建存储过程
单击 创建,完成新建存储过程后,可以如同调用系统内置函数一样,使用关键字 CALL
调用用户自定义的存储过程。
语法格式:
CALL proc_name ([proc_parameter [,...]]);
示例:
CALL proc_total (30000, 20000);