MyBatis 教程

存储过程基础知识

MySQL 5.0 版本开始支持存储过程。存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

优点

  • 存储过程可封装,并隐藏复杂的商业逻辑。

  • 存储过程可以回传值,并可以接受参数。

  • 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。

  • 存储过程可以用在数据检验,强制实行商业逻辑等。

缺点

  • 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。

  • 存储过程的性能调校与撰写,受限于各种数据库系统。

存储过程语法

MySQL数据库创建存储过程的语法如下:

CREATE
    [DEFINER = { user | CURRENT_USER }]
 PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
 proc_parameter:
    [ IN | OUT | INOUT ] param_name type
 characteristic:    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER } 
routine_body:
  Valid SQL routine statement
 [begin_label:] BEGIN  [statement_list]
    ……END [end_label]

MySQL 存储过程中的关键语法如下:

(1)声明语句结束符,可以自定义

DELIMITER $$
-- 或
DELIMITER //

(2)声明存储过程

CREATE PROCEDURE demo_in_parameter(IN p_in int)

(3)存储过程开始和结束符号

BEGIN
     -- .... 
END

(4)变量赋值

SET @p_in=1

(5)变量定义

DECLARE l_int int unsigned default 4000000;

存储过程参数类型

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,分别为 IN, OUT, INOUT,形式如:

CREATEPROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])

参数类型详解:

  • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)

  • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

  • INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

实例

下面通过一个实例来简单介绍存储过程创建过程,该存储过程将根据传递的用户ID返回用户名称。代码如下:

-- 创建名为 proc_getUserName 的存储过程
-- 分别定义输入参数 userId、输出参数 userName
CREATE PROCEDURE `proc_getUserName`(IN `userId` int,OUT `userName` varchar(100))
BEGIN
	-- 根据 userId 查询指定的用户,然后使用 into 语句将查询结果放入到 userName 参数中
	select `name` into userName from `user` where user_id=userId;
END

我们可以使用 call 命令去调用刚刚创建的过程。如下:

-- 声明一个变量
mysql> set @userName='';
Query OK, 0 rows affected (0.00 sec)

-- 调用存储过程
mysql> call proc_getUserName(1, @userName);
Query OK, 1 row affected (0.00 sec)

-- 查看存储过程执行结果
mysql> select @userName;
+-----------+
| @userName |
+-----------+
| Tom       |
+-----------+
1 row in set (0.03 sec)
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号