MySQL的存储过程/触发器/事务的总结(一):存储过程 MySQL总结技术存储过程
- 创建时间:2023-03-28 / 最新修改时间:2023-03-28 11:17:43
- 17248
- 0
转载请注明本文出处:http://limpire.cn/artifact/programming/db/219.html
MySQL的存储过程/触发器/事务的总结(一):存储过程
以下总结基于Mysql5.7
存储过程和储存函数的区别
存储函数 | 存储过程 |
---|---|
不能拥有输出参数 | 可以拥有输出参数 |
可以直接调用存储函数,不需要call语句 | 需要call语句调用存储过程 |
必须包含一条return语句 | 不允许包含return语句 |
不能使用SQL预处理,即动态SQL. | 可以使用SQL预处理 |
不能返回结果集(不能有select 的直接结果) | 可以有select 结果集 |
创建储存过程和函数
--这个是储存过程
CREATE PROCUDURE sp_name ([传出/入参数[,...]])
[特征 ...] 语句正文
-- 这个是存储函数
CREATE FUNCTION sp_name [参数[....]] RETURNS 类型
[特征 ...] 语句正文
RETURN result;
--存储过程例子:
CREATE PROCUDURE get_users ( IN number INT(10),
OUT users VARCHAR(255),
INOUT info VARCHAR(255)
) COMMIT '这是一个例子'
BEGIN
select name into users from users where id=number;
END;
修改储存过程/函数和删除存储过程/函数
- mysql 不支持通过ALTER PROCEDURE 修改存储过程或函数的代码,只能修改其定义
- DROP 存储过程名 语句删除存储过程或函数
显示存储过程/存储函数 详细信息
SHOW CREATE PROCEDURE
存储过程名SHOW CREATE FUNCTION
函数名SHOW PROCEDURE STATUS
返回所有存储过程的信息.SHOW FUNCTION STATUS
返回所有存储过程的信息.
调用存储过程和函数
CALL sp_name(@p1,@p2);
-- 调用存储过程的参数变量需要加@,因为这是用户变量
-- 存储函数可以不用CALL
BEGIN ... END 复核语句
[begin_label:] BEGIN
[语句列]
END [end_label]
- 每条语句比用;分隔.
- label 必需成对出现,则名字要一样
- 同一个 being 和end 包裹下的变量为此区域的局部变量
- 同一个being和end包裹下的处理程序都是在此作用于.
being...end的作用离不开"作用域"这个概念.
例如,变量作用域,异常处理作用域,也会作用域的情况下还会更改异常处理程序的优先级等.
嵌套BEING...END ,可以在其中再定义局部变量,处理程序,或者是其他DACLARE 定义等.
存储程序中的变量
MySQL:用户变量、系统变量、局部变量(存储过程中的)
-
用户变量:
- 概念:
基于会话变量实现的, 可以暂存值, 并传递给同一连接里的下一条sql使用的变量.当客户端连接退 出时,变量会被释放。 - 定义:
以"@"开始,形式为"@变量名" 注:用户变量跟mysql客户端是绑定的,设置的变量,只对当前 用户使用 的客户端生效。也叫会话变量。 - 赋值:
set @test=1,@test2=2;
set @test,@test2:=2;
- 查询变量值:
select @test
- 概念:
-
系统变量
- 概念:
MySQL可以访问许多系统变量。当服务器运行时许多变量可以动态更改。这样通常允许你修改服务器操作而不需要停止并重启服务器。当服务器启动时,它将所有全局变量初始化为默认值。这些默认值可以在选项文件中或在命令行中指定的选项进行更改。服务器启动后,通过连接服务器并执行SET GLOBAL var_name语句,可以动态更改这些全局变量。要想更改全局变量,必须具有SUPER权限。 - 使用:
SET @@global.sort_buffer_size=value;
SET GLOBAL sort_buffer_size=value
- 概念:
-
局部变量
请参考下文:
DECLARE 定义局部变量
- 定义一个变量,或光标
- 只能在
BEGIN - END
中使用,且必需在任何语句之前.
例子:
DECLARE name,age VARCHAR(25) DEFAULT '空'
DECLARE var_name[,...] type [DEFAULT value]
SET
- 给一个局部变量赋值
例子:
SET name='LIN',age='18'
SET var_name = expr [, var_name = expr] ...
SELECT ... INTO
- 把指定列赋值给变量
- 变量名和列名不能相同
例子:
SELECT name into users,age FROM user LIMIT 1;
- 因为只能把一行中的的一列赋值给变量users 所以 需要添加 LIMIT 1;
SELECT col_name[,...] INTO var_name[,...] table_expr