MySQL存储过程之创建第一个存储过程
1. 选择分隔符
在开始创建工作之前,我们需要定义一个分隔符,SQL语句如为:
1 | mysql> DELIMITER // |
分隔符是你通知MySQL客户端你已完成一个sql语句的输入的字符或字符串符号,之前大多使用分号(;).由于在存储过程中,分号本身极有可能是存储过程本身的内容,基于这个原因,所以需要先定义一个其他的分隔符代替,定义完存储过程后可以通过以下语句恢复为分号:
mysql> DELIMITER ;
2. 创建程序实例
CREATE PROCEDURE p1() SELECT * FROM t;
1) CREATE PROCEDURE:表示创建存储过程的命令
2) p1:存储过程的名字
说明:存储过程命名不区分大小写,同一数据库内的存储过程命名不能重复(否则会导致重载,某些DBMS允许重载,如Oracle,但MySQL不允许).存储过程名可以分开,可以包括空格,长度限制64个字符,但不能使用MySQL的内建函数名.
3) ():括号里是参数列表,可以没有参数,但括号必需!
4) SELECT * FROM t;:存储过程的执行内容,此处只有一句代码.这是存储过程的主体,是一般的sql语句,除非语句后是结束符号,否则分号是必须的.
3. 可出现在存储过程体中的合法sql语句
一个存储过程体中可以包含,INSERT, UPDATE, DELETE, SELECT, DROP, CREATE, REPLACE 等等sql语句,但要注意的是如果代码中包含MySQL的扩充功能,则代码将不能移植.
# 标准sql语句中,任何数据库操纵语言都是合法的: CREATE PROCEDURE P() DELETE FROM t; # SET COMMIT及ROLLBACK也是合法的: CREATE PROCEDURE P() SET @x=5; # MySQL的附加功能:任何数据定义语言的命令也是合法的: CREATE PROCEDURE P() DROP TABLE t; # MySQL扩充功能:直接的SELECT也是合法的: CREATE PROCEDURE P() SELECT 'a';
之所以将存储过程中包括DDL语句的功能称为MySQL附加功能的原因是在sql标准中将这个定义为非核心的,即可选组件.
在过程体中有一个约束,就是不能有对全程或表操作的数据库操作语句,如:
CREATE PROCEDURE p1 () CREATE PROCEDURE p2 () DELETE FROM t;
以下语句对MySQL5.0来说都是全新的,不能出现在存储过程中:CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION,DROP FUNCTION, CREATE TRIGGER, DROP TRIGGER. 不过你可以使用 "CREATE PROCEDURE db5.p1 () DROP DATABASE db5;",但是类似 "USE database" 语句也是非法的,因为MySQL假定默认数据库就是过程的工作场所。
4. 调用存储过程
1) 要调用一个存储过程,只要输入CALL跟一个存储过程的名字及一个括号:
CREATE PROCEDURE p1() SELECT * FROM t; # ... ... mysql> CALL p1()// #此处不是分号,原因见上
上述代码执行后屏幕返回t表的所有字段的所有记录.
2) 其他实现方式:
以下语句的执行效果相同:
mysql> CALL p1() //
# ... ... mysql> SELECT * FROM t; //
所以调用存储过程和直接执行里面的sql指令是一样的.
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 大数据高并发核心场景实战,数据持久化之冷热分离
· 运维排查 | SaltStack 远程命令执行中文乱码问题
· Java线程池详解:高效并发编程的核心利器
· 从“看懂世界”到“改造世界”:AI发展的四个阶段你了解了吗?
· 协程本质是函数加状态机——零基础深入浅出 C++20 协程
· .NET 8 gRPC 实现高效100G大文件断点续传工具
· STM32学会要花费多长时间?一个从机械转行老程序员的血泪史
· LinqPad:C#代码测试学习一品神器
· .NET入行第4年(第二集)
· C#/.NET/.NET Core技术前沿周刊 | 第 43 期(2025年6.16-6.22)