MySQL的存储过程/触发器/事务的总结(一):存储过程 MySQL总结技术存储过程
- 创建时间:2023-03-28 / 最新修改时间:2023-03-28 11:17:43
 - 18987
 - 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
                        
                        
                                