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


请说:

昵称 Email

评论:

吃不起海鲜就买海鲜味的酱油

回车换行很爽,代表着一个段落或者一个小结的完成,打印出来之后就是一个可触摸的成品.围着这种意境,一起来技术性打酱油.

文章列表
分类目录
友情链接