MySQL存储过程
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,博文大纲:1、什么是存储过程?2、存储过程有哪些优点?3、自定义存储过程举例4、while循环的存储过程5、带有if判断的存储过程6、带有case的存储过程7、将存储过程传出到全局环境变量8、其他关于
千家信息网最后更新 2025年11月06日MySQL存储过程
博文大纲:
- 1、什么是存储过程?
- 2、存储过程有哪些优点?
- 3、自定义存储过程举例
- 4、while循环的存储过程
- 5、带有if判断的存储过程
- 6、带有case的存储过程
- 7、将存储过程传出到全局环境变量
- 8、其他关于存储过程的操作语句
- 9、附加:如何复制表。
前言
存储过程是数据库存储的一个重要的功能,MySQL在5.0以前的版本不支持存储过程,存储过程可以在大大提高数据库处理速度的同时提高数据库编程的灵活性。
1、什么是存储过程?
存储过程是一组为了完成特定功能的SQL语句集合。使用存储过程的目的是将常用或复杂的工作预先用SQL语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器中,因此成为存储过程。当以后需要数据库提供与定义好的存储过程的功能相同的服务时,只需要调用"CALL 存储过程名字"即可自动完成。
一个存储过程是一个可编程的函数,它在数据库中创建并保存,一般由 SQL 语句和一些特殊的控制结构组成。
当希望在不同的应用程序或平台上执行相同的特定功能时,存储过程尤为合适。
2、存储过程有哪些优点?
- 封装性:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的 SQL 语句,并且DBA可以随时对存储过程进行修改,而不会影响到调用它的应用程序源代码。
- 可增强:SQL 语句的功能和灵活性 存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
- 可减少网络流量:由于存储过程是在服务器端运行的,且执行速度快,因此当客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而可降低网络负载。
- 高性能:存储过程执行一次后,产生的二进制代码就驻留在缓冲区,在以后的调用中,只需要从缓冲区中执行二进制代码即可,从而提高了系统的效率和性能。
- 提高数据库的安全性和数据的完整性:使用存储过程可以完成所有数据库操作,并且可以通过编程的方式控制数据库信息访问的权限。
3、自定义存储过程举例
mysql> select * from t1; +------+------+------------+---------+| f_id | s_id | f_name | f_price |+------+------+------------+---------+| a1 | 101 | apple | 5.20 || a2 | 103 | apricot | 2.20 || b1 | 101 | blackberry | 10.20 || b2 | 104 | berry | 7.60 || b5 | 107 | xxxx | 3.60 || bs1 | 102 | orange | 11.20 || bs2 | 105 | melon | 8.20 || c0 | 101 | cherry | 3.20 || l2 | 104 | lemon | 6.40 || m1 | 106 | mango | 15.70 || m2 | 105 | xbabay | 2.60 || m3 | 105 | xxtt | 11.60 || o2 | 103 | coconut | 9.20 || t1 | 102 | banana | 10.30 || t2 | 102 | grape | 5.30 || t4 | 107 | xbababa | 3.60 |+------+------+------------+---------+mysql> delimiter // mysql> create procedure test() -> begin -> select * from t1; -> end//Query OK, 0 rows affected (0.00 sec)mysql> delimiter ; mysql> call test(); +------+------+------------+---------+| f_id | s_id | f_name | f_price |+------+------+------------+---------+| a1 | 101 | apple | 5.20 || a2 | 103 | apricot | 2.20 || b1 | 101 | blackberry | 10.20 || b2 | 104 | berry | 7.60 || b5 | 107 | xxxx | 3.60 || bs1 | 102 | orange | 11.20 || bs2 | 105 | melon | 8.20 || c0 | 101 | cherry | 3.20 || l2 | 104 | lemon | 6.40 || m1 | 106 | mango | 15.70 || m2 | 105 | xbabay | 2.60 || m3 | 105 | xxtt | 11.60 || o2 | 103 | coconut | 9.20 || t1 | 102 | banana | 10.30 || t2 | 102 | grape | 5.30 || t4 | 107 | xbababa | 3.60 |+------+------+------------+---------+16 rows in set (0.00 sec)通过上面的例子可以看出,存储过程是类似于一个shell脚本的,存放的是一些sql语句的集合,当然,它同样有一些判断、循环等语句,如下。
4、while循环的存储过程
下面的例子是存储过程借助while循环来计算1+2+3...+100的结果是多少。
mysql> delimiter // mysql> create procedure test1() -> begin -> declare n int; -> declare summary int; -> set n=0; -> set summary=0; -> while n<=100 -> do -> set summary=summary+n; -> set n=n+1; -> end while; -> select summary; -> end // mysql> delimiter ; mysql> call test1(); +---------+| summary |+---------+| 5050 |+---------+1 row in set (0.00 sec)5、带有if判断的存储过程
以下实现的是如果传参的值大于或等于10,则执行else下面的SQL语句,如果传参的值小于10,则执行then下面的SQL语句。
mysql> delimiter // mysql> create procedure test3(in num int) -> begin -> if num < 10 then -> select * from t1 where f_price<10; -> else -> select * from t1 where f_price>=10; -> end if; -> end -> //Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;mysql> call test3(9); +------+------+---------+---------+| f_id | s_id | f_name | f_price |+------+------+---------+---------+| a1 | 101 | apple | 5.20 || a2 | 103 | apricot | 2.20 || b2 | 104 | berry | 7.60 || b5 | 107 | xxxx | 3.60 || bs2 | 105 | melon | 8.20 || c0 | 101 | cherry | 3.20 || l2 | 104 | lemon | 6.40 || m2 | 105 | xbabay | 2.60 || o2 | 103 | coconut | 9.20 || t2 | 102 | grape | 5.30 || t4 | 107 | xbababa | 3.60 |+------+------+---------+---------+11 rows in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)mysql> call test3(10); +------+------+------------+---------+| f_id | s_id | f_name | f_price |+------+------+------------+---------+| b1 | 101 | blackberry | 10.20 || bs1 | 102 | orange | 11.20 || m1 | 106 | mango | 15.70 || m3 | 105 | xxtt | 11.60 || t1 | 102 | banana | 10.30 |+------+------+------------+---------+5 rows in set (0.00 sec)6、带有case的存储过程
该存储过程实现结果为:当传入的值为偶数时,输出t1表中s_id列为偶数的行,如果传入的值为奇数,输出s_id列为奇数的行,否则输出空。
mysql> delimiter //mysql> create procedure test4(in num int) -> begin -> case num%2 -> when 0 then -> select * from t1 where s_id%2=0; -> when 1 then -> select * from t1 where s_id%2=1; -> else -> select null; -> end case; -> end -> //mysql> delimiter ;mysql> call test4(4); +------+------+--------+---------+| f_id | s_id | f_name | f_price |+------+------+--------+---------+| b2 | 104 | berry | 7.60 || bs1 | 102 | orange | 11.20 || l2 | 104 | lemon | 6.40 || m1 | 106 | mango | 15.70 || t1 | 102 | banana | 10.30 || t2 | 102 | grape | 5.30 |+------+------+--------+---------+6 rows in set (0.00 sec)mysql> call test4(3); +------+------+------------+---------+| f_id | s_id | f_name | f_price |+------+------+------------+---------+| a1 | 101 | apple | 5.20 || a2 | 103 | apricot | 2.20 || b1 | 101 | blackberry | 10.20 || b5 | 107 | xxxx | 3.60 || bs2 | 105 | melon | 8.20 || c0 | 101 | cherry | 3.20 || m2 | 105 | xbabay | 2.60 || m3 | 105 | xxtt | 11.60 || o2 | 103 | coconut | 9.20 || t4 | 107 | xbababa | 3.60 |+------+------+------------+---------+7、将存储过程传出到全局环境变量
mysql> delimiter //mysql> create procedure test6(out num float) -> begin -> select max(f_price) into num from t1; -> end -> //Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;mysql> call test6(@num);Query OK, 1 row affected (0.00 sec)mysql> select @num; +--------------------+| @num |+--------------------+| 15.699999809265137 |+--------------------+1 row in set (0.00 sec)8、其他关于存储过程的操作语句
mysql> help procedure; topics: ALTER PROCEDURE CREATE PROCEDURE DROP PROCEDURE PROCEDURE ANALYSE SELECT SHOW SHOW CREATE PROCEDURE 存储过程名 9、附加:如何复制表。
方法1:like方法能一模一样的将一个表的结果复制生成一个新表,包括复制表的备注、索引、主键外键、存储引擎等。但是不包括表数据,如下:
mysql> create table new_t1 like t1;Query OK, 0 rows affected (0.00 sec)mysql> desc new_t1;+---------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+---------+--------------+------+-----+---------+-------+| f_id | char(10) | NO | | NULL | || s_id | int(11) | NO | | NULL | || f_name | char(255) | NO | | NULL | || f_price | decimal(8,2) | NO | | NULL | |+---------+--------------+------+-----+---------+-------+4 rows in set (0.00 sec)方法2: select的方法值复制字段属性,其它的主键、索引、表备注、存储引擎都没有复制。如下:
mysql> create table new_t1_2 select * from t1;Query OK, 16 rows affected (0.01 sec)Records: 16 Duplicates: 0 Warnings: 0mysql> select * from new_t1_2;+------+------+------------+---------+| f_id | s_id | f_name | f_price |+------+------+------------+---------+| a1 | 101 | apple | 5.20 || a2 | 103 | apricot | 2.20 || b1 | 101 | blackberry | 10.20 || b2 | 104 | berry | 7.60 || b5 | 107 | xxxx | 3.60 || bs1 | 102 | orange | 11.20 || bs2 | 105 | melon | 8.20 || c0 | 101 | cherry | 3.20 || l2 | 104 | lemon | 6.40 || m1 | 106 | mango | 15.70 || m2 | 105 | xbabay | 2.60 || m3 | 105 | xxtt | 11.60 || o2 | 103 | coconut | 9.20 || t1 | 102 | banana | 10.30 || t2 | 102 | grape | 5.30 || t4 | 107 | xbababa | 3.60 |+------+------+------------+---------+16 rows in set (0.00 sec)-------- 本文至此结束,感谢阅读 --------
存储
过程
语句
数据
数据库
功能
方法
面的
循环
复杂
灵活性
程序
结果
网络
控制
服务
输出
相同
二进制
代码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
云计算机怎么访问本地服务器
阴阳师中如何转服务器
网络安全一个中心三重防护理解
数据库怎么登录
佳瑶网络技术
dba学哪个数据库最好
网络安全概念股票H股
dns服务器测试失败
java项目查看服务器日志
网络安全热门技术点
怎么学好数据库技术与应用
钣金放样软件开发
老版lol服务器图标
网络安全检查室
库里sql数据库
sql 数据库复制技术
数据库bind操作
绿色阅读手抄报比赛网络安全
同一数据库中
注册了域名必须买服务器才能用吗
网络安全法是什么实施
谷歌云多台服务器数据共享
pc端软件开发需要ssm
兰溪软件开发招聘
教务管理数据库
江苏程序软件开发服务
四川中翼互联网科技有限公司
滨江道购物软件开发
新型的手机软件开发
湖北c语言软件开发服务