MYSQL 存储过程
MYSQL 存储过程
存储过程(Stored Procedure):在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
优点:
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
- 存储过程可以用在数据检验,强制实行商业逻辑等。
缺点:
- 存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
- 存储过程的性能调校与撰写,受限于各种数据库系统。
1. 存储过程的创建与调用
- 存储过程就是具有名字的一段代码,用来完成一个特定的功能。
- 创建的存储过程保存在数据库的数据字典中。
/**
声明语句结束符,可以自定义
**/
DELIMITER $$ 或 DELIMITER //
/**
声明存储过程
**/
CREATE PROCEDURE demo_in_parameter(IN p_in int)
/**
存储过程开始和结束符号
**/
BEGIN .... END
/**
变量赋值
**/
SET @p_in=1
/**
变量定义
**/
DECLARE l_int int unsigned default 4000000;
/**
创建mysql存储过程、存储函数
**/
create procedure 存储过程名(参数)
/**
存储过程体
**/
create function 存储函数名(参数)
完整DEMO
mysql> delimiter $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)
-> BEGIN
-> DELETE FROM MATCHES
-> WHERE playerno = p_playerno;
-> END$$
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter; #将语句的结束符号恢复为分号
注意点:默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀。
存储过程体:
- 存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等
- 过程体格式:以begin开始,以end结束(可嵌套)
label1: BEGIN
label2: BEGIN
label3: BEGIN
statements;
END label3 ;
END label2;
END label1
标签有两个作用:
- 1、增强代码的可读性
- 2、在某些语句(例如:leave和iterate语句),需要用到标签
2. 存储过程的参数
CREATE PROCEDURE 存储过程名([[IN |OUT |INOUT ] 参数名 数据类形...])
- IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
- OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
- INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
注意点:
1、如果过程没有参数,也必须在过程名后面写上小括号:
CREATE PROCEDURE sp_name ([proc_parameter[,...]]) ……
2、确保参数的名字不等于列的名字,否则在过程体中,参数名被当做列名来处理
建议:
- 输入值使用in参数。
- 返回值使用out参数。
- inout参数就尽量的少用。
3. 变量
3.1 变量定义
DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
// 举例
DECLARE l_int int unsigned default 4000000;
DECLARE l_numeric number(8,2) DEFAULT 9.95;
DECLARE l_date date DEFAULT '1999-12-31';
DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';
DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';
3.2 变量赋值
SET 变量名 = 表达式值 [,variable_name = expression ...]
3.3 用户变量
mysql > SELECT 'Hello World' into @x;
mysql > SELECT @x;
+-------------+
| @x |
+-------------+
| Hello World |
+-------------+
mysql > SET @y='Goodbye Cruel World';
mysql > SELECT @y;
+---------------------+
| @y |
+---------------------+
| Goodbye Cruel World |
+---------------------+
mysql > SET @z=1+2+3;
mysql > SELECT @z;
+------+
| @z |
+------+
| 6 |
+------+
注意点:
- 1、用户变量名一般以@开头
- 2、滥用用户变量会导致程序难以理解及管理
4. 注释
- 单行注释:--
- 多行注释:C风格
- 查询存储过程
selectname from mysql.proc where db='数据库名';
selectroutine_name from information_schema.routines where routine_schema='数据库名';
showprocedure status where db='数据库名';
- 查询存储过程详细信息
SHOWCREATE PROCEDURE 数据库.存储过程名;
- 修改存储过程
ALTER PROCEDURE
- 删除存储过程
DROP PROCEDURE
引用:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程