MySQL 存储过程
MySQL 存储过程
什么是存储过程
存储过程是存储在数据库中可以执行特定功能的一组SQL代码的程序段(函数)
存储过程的使用
创建存储过程
语法:
CREATE PROCEDURE 过程名( [ IN | OUT | INOUT ] 参数名 数据类型) 过程体
DELIMITER -- 声明分割符(告诉编译器分隔符以下内容是存储过程)
CREATE PROCEDURE myproc(OUT param int)
BEGIN
SELECT COUNT(*) INTO param FROM student;
END
DELIMITER; -- 还原分割符
- IN-参数的值在调用存储过程时指定,默认值
- OUT-参数的值可以在存储过程中被改变,可返回
- INOUT-参数的值在调用存储过程时指定,可被修改和返回
注意:存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开
调用存储过程
语法:
CALL PROCEDURE 过程名(@参数1,@参数2,@参数…);
- 存储过程实际上是一种函数,所以存储过程名后需要有()符号(即使不传递参数也需要)
- 调用存储过程将执行存储过程体中的SQL语句,并返回执行结果
- 所用传递的参数名都必须以 @ 开头
删除存储过程
语法:
DROP PROCEDURE 过程名;
- 如果指定的存储过程不存在,删除存储过程将产生 一个执行错误
- 不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
查看存储过程
语法一:
SHOW CREATE PROCEDURE 过程名;
- 显示某一个MySQL存储过程的详细信息
语法二:
SHOW PROCEDURE STATUS;
- 显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
存储过程编程
基本数据类型
-
整型
整型数据类型主要用来存储数字,包含的类型有:TINYINT、SMALLINT、MEDIUMINT、 INT(INTEGER)、 BIGINT
-
浮点/定点
浮点/顶点数据类型主要用来存储小数,包含的类型有:FLOAT、DOUBLE、DECIMAL(定点)
-
日期/时间
日期/时间数据类型主要用来存储日期或时间,包含的类型有:DATETIME、DATE、TIMESTAMP、TIME和YEAR
-
字符串
日期/时间数据类型主要用来存储日期或时间,包含的类型有:DATETIME、DATE、TIMESTAMP、TIME和YEAR
-
二进制
MySQL中存储二进制数据包含的类型有:BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB
变量
用户变量
用户变量与数据库连接有关,在这个连接中声明的变量,在连接断开的时候,就会消失。在此连接中声明的变量无法在另一连接中使用。
语法:
SET ‘@变量名’= 变量值;
- 声明变量的时候需要使用set语句
- 变量名必须以@开头
- 声明变量需要初始化赋值
- 可以使用select 语句打印变量值(MySQL没有print语句)
- 还可以使用select 语句给变量赋值
注意:MySQL里面的变量是不严格限制数据类型的,它的数据类型根据你赋给它的值而随时变化
系统变量
-
会话变量:会话就是指数据库连接,初始化时会话变量和全局变量相同,和全局变量的区别在于会话变量的修改只会影响当前会话
-
全局变量:MySQL配置文件my.ini中定义的配置相关变量,修改全局变量会影响到整个服务器
运算符
- 算术运算符:加(+)、减( -)、乘( *)、除( /)、 整除(DIV)、 取模(%)
- 关系运算符:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(=)、不等于(<> 或 !=)、在集合中(in)、不在集合中(not in)、两值之间(between)、模糊匹配(like)、为空(is null)、不为空(is not null)
- 逻辑运算符:逻辑非(not 或 !)、逻辑与(and 或 &&)、逻辑或(or 或 ||)、逻辑异或(xor)
- 位运算符:位与(&)、位或(|)、位非(~)、位异或(^)、位左移(<<)、位右移(>>)
流程控制
- 顺序流程:顺序结构是最简单的程序结构,也是最常用的结构,它的执行顺序是自上而下,依次执行
- 分支结构(IF、CASE):分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序
- 循环结构(WHILE、LOOP、REPART):循环结构可以看成是一个条件判断语句和一个向回转向语句的组合。
存储过程的优点
增强 SQL 语句的功能和灵活性
存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算
标准组件式编程
存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句,而且数据库维护人员随时可以对存储过程进行修改,对程序源代码毫无影响
更快执行速度
存储过程比批处理的执行速度还要快很多,因为存储过程是预编译的
减少网络流量
存储过程存放在数据库中,执行存储过程时网络只需要传输调用存储过程的名字以及变量,而不是SQL语句,从而大大减少网络流量并降低了网络负载
可作为一种安全机制
通过对执行某一存储过程的权限进行限制,能够对相应的数据的访问权限的控制,避免了非授权用户对数据的访问,保证数据安全
存储过程的缺点
复杂业务逻辑处理能力不足
存储过程本质上是过程化处理方式,针对复杂业务逻辑处理能力明显不如面向对象方式
不便于调试
基本上没有较好的调试器,很多时候是用print来调试,这种方法调试复杂存储非常繁琐而效率低下
无法应用缓存
虽然有全局临时表可以做缓存,但会加重数据库负担。如果缓存并发严重,则需要加锁机制,严重影响性能
可移植性差
如果需要更换数据库,存储过程无法移植到其他类型数据库中
容易滥用存储过程
利用存储过程转嫁程序业务逻辑处理代码,导致数据库除存储数据还承担过多业务功能,可维护性降低

浙公网安备 33010602011771号