最新要闻
- 女子应聘被HR质疑23岁用苹果手机:称其年纪小 手机贵
- 天天速讯:四川一高校放7天春假 鼓励大家去恋爱!网友:坚持一个四川原则
- 环球速递!腾讯2022年人均年薪102.5万!一年增加近20万
- 世界资讯:“长胡子”了 比亚迪海豚泰国版发布:售价约16万人民币
- 【全球新视野】被马化腾视为腾讯希望!微信视频号使用时长已超朋友圈
- 世界看热讯:农历中的惊蛰到底有什么寓意?
- 中国西北地区发现广泛分布的侏罗纪被子植物化石
- 3年陈花香白牡丹:董德福鼎白茶200g装128元大促(200元券)
- 环球快看:188GB显存 800W功耗!NVIDIA发布H100 NVL加速卡:ChatGPT提速2倍
- 世界新资讯:美国两囚犯用牙刷挖洞越狱成功:墙内钢筋松了!职能部门颜面扫地
- 当前观察:9岁女孩豪掷18.9万打赏游戏主播 偷偷记下密码还删除转账记录
- 天天速讯:新能源汽车高速没电竟然倒车回服务区充电 后方车辆纷纷避让
- 【聚看点】澳弘电子(605058.SH):年产高精密度多层板、高密度互连积层板120万平方米建设项目及研发中心升级改造项目结项
- 真我GT Neo5 SE“最终幻想”配色回归:赛博朋克风满满
- 当前消息!《黑暗荣耀2》蝉联网飞电视剧全球榜第一:观看时间过亿
- 当前热门:又一日系即将退出中国?广汽三菱否认传闻:正常运转
手机
![iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?](http://tuxianggu.4898.cn/thumb/uploads/2020-07-29/db49b24a344ffac3e19f762856828ea8.jpg)
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
![警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案](http://i2.chinanews.com/simg/cmshd/2021/05/16/657ff48335db44a494ca7580d58c6477.jpg)
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
数据库系统原理之数据库编程
数据库编程
第一节 存储过程
一、存储过程的基本概念
- 存储过程是一组为了完成某项特定功能的 SQL 语句集,其实质上就是一段存储在数据库中的代码,它可以由声明式的 SQL 语句(如 CREATE、UPDATE 和 SELECT 等语句)和过程式 SQL 语句(如 IF...THEN...ELSE 控制结构语句)组成。
- 这组语句集经过编译后会存储在数据库中,用户只需通过指定存储过程的名字并给定参数(如果该存储过程带有参数),即可随时调用并执行它,而不必重新编译,因此这种通过定义一段程序存储在数据库中的方式,可加大数据库操作语句的执行效率。
- 使用存储过程通常具有以下一些好处:
- 可增强SQL语言的功能和灵活性
- 良好的封装性
- 高性能
- 可减少网络流量
- 存储过程可作为一种安全机制来确保数据库的安全性和数据的完整性
二、创建存储过程
DELIMITER 命令的使用语法格式是:
(相关资料图)
DELIMITER $$
- $$ 是用户定义的结束符,通常这个符号可以是一些特殊的符号,例如两个“#”,或两个“¥”等
- 当使用 DELIMITER 命令时,应该避免使用反斜杠(“\”)字符,因为它是MySQL的转义字符
例子:将 MySQL 结束符修改为两个感叹号“!!”。
mysql> DELIMITER !!
换回默认的分行“;”
mysql> DELIMITER ;
创建存储过程
CREATE PROCEDURE sp_name ([proc_parameter[,...]])routine_body
"proc_parameter" 的语法格式:
[IN | OUT | INOUT] param_name type# 参数的取名不要与数据表的列名相同
- 语法项“routine_body” 表示存储过程的主体部分,也称为存储过程体,其包含了在过程调用的时候必须执行的SQL语句。
- 这个部分以关键字“BEGIN” 开始,以关键字“END”结束。
- 如若存储过程体中只有一条 SQL语句时,可以省略 BEGIN...END 标志。
- 在存储过程体中,BEGIN...END 复合语句可以嵌套使用
例子:在数据库 mysql_test 中创建一个存储过程,用于实现给定表 customers 中一个客户 id 号即可修改表 customers 中该客户的性别为一个指定的性别。
➜ mysql -uroot -pEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 1850Server version: 8.0.32 HomebrewCopyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type "help;" or "\h" for help. Type "\c" to clear the current input statement.mysql> use mysql_test;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> delimiter $$mysql> create procedure sp_update_sex(in cid int,in csex char(1)) -> begin -> update customers set cust_sex=csex where cust_id=cid; -> end $$Query OK, 0 rows affected (0.03 sec)mysql>
三、存储过程体
1 局部变量
- 用来存储存储过程体中的临时结果
DECLARE var_name[,...] type [DEFAULT value]
例子:声明一个整形局部变量 cid。
DECLARE cid INT(10);
- 局部变量只能在存储过程体的 BEGIN...END 语句块中声明
- 局部变量必须在存储过程体的开头出声明
- 局部变量的作用范围仅限于声明它的 BEGIN...END 语句块,其他语句块中的语句不可以使用它
- 局部变量不同于用户变量,两者的区别是:
- 局部变量声明时,在其前面没有使用 @ 符号,并且它只能被声明它的 BEGIN...END 语句块中的语句所使用
- 用户变量在声明时,会在其名称前面使用 @ 符号,同时已声明的用户变量存在于整个会话之中
2 SET 语句
SET var_name = expr [, var_name = expr] ...
例子:为声明的局部变量 cid 赋予一个整数值 910
SET cid=910;
3 SELECT...INTO 语句
- 把选定列的值直接存储到局部变量中
SELECT col_name [,...] INTO var_name[,...] table_expr
- 存储过程体中的 SELECT...INTO 语句返回的结果集只能有一行数据
4 流程控制语句
(1)条件判断语句
- 常用的条件判断语句有 IF...THEN...ELSE 语句和 CASE 语句。
- 它们的使用语法及方式类似于高级程序设计语言。
(2)循环语句
- 常用的循环语句有 WHILE 语句、REPEAT 语句和 LOOP 语句。
- 它们的使用语法及方式同样类似于高级程序设计语言。
- 循环语句中还可以使用 ITERATE 语句,但它只能出现在循环语句的 LOOP、REPEAT 和 WHILE 子句中,用于表示退出当前循环,且重新开始一个循环。
5 游标
- 在MySQL中,一条 SELECT...INTO 语句成功执行后,会返回带有值的一行数据,这行数据可以被读取到存储过程中进行处理。
- 然而,在使用 SELECT 语句进行数据检索时,若该语句成功被执行,则会返回一组称为结果集的数据行,该结果集中可能拥有多行数据,这些数据无法直接被一行一行地进行处理,此时就需要使用游标。
- 游标是一个被 SELECT 语句检索出来的结果集。
- 在存储了游标后,应用程序或用户就可以根据需要滚动或浏览其中的数据。
在MySQL中,使用游标的具体步骤如下:
(1)声明游标
DECLARE cursor_name CURSOR FOR select_statement
- 语法项“select_statement”用于指定一个 SELECT 语句,其会返回一行或多行的数据,且需注意此处的 SELECT 语句不能有 INTO 子句。
(2)打开游标
OPEN cursor_name
(3)读取数据
FETCH cursor_name INTO var_name [, var_name] ...
- 游标相当于一个指针,它指向当前的一行数据。
(4)关闭游标
CLOSE cursor_name
- 如果没有明确关闭游标,MySQL将会在到达 END 语句时自动关闭它。
- 在一个游标被关闭后,如果没有重新被打开,则不能被使用。
- 对于声明过的游标,则不需要再次声明,可直接使用 OPEN 语句打开。
例子:在数据库 mysql_test 中创建一个存储过程,用于计算表 customers 中数据行的行数。
首先,在MySQL命令行客户端输入如下 SQL语句创建存储过程 sq_sumofrow:
➜ mysql -uroot -pEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 2286Server version: 8.0.32 HomebrewCopyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type "help;" or "\h" for help. Type "\c" to clear the current input statement.mysql> use mysql_test;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> delimiter $$mysql> create procedure sp_sumofrow(OUT ROWS INT) -> begin -> declare cid int; -> declare found boolean default true; -> declare cur_cid cursor for -> select cust_id from customers; -> declare continue handler for not found -> set found=false; -> set rows=0; -> open cur_cid; -> fetch cur_cid into cid; -> while found do -> set rows=rows+1; -> fetch cur_cid into cid; -> end while; -> close cur_cid; -> end$$ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near "ROWS INT)begindeclare cid int;declare found boolean default true;declare cur" at line 1mysql> mysql> CREATE PROCEDURE sp_sumofrow(OUT ROWS INT) -> BEGIN -> DECLARE cid INT; -> DECLARE FOUND BOOLEAN DEFAULT TRUE; -> DECLARE cur_cid CURSOR FOR -> SELECT cust_id FROM customers; -> DECLARE CONTINUE HANDLER FOR NOT FOUND -> SET FOUND=FALSE; -> SET ROWS=0; -> OPEN cur_cid; -> FETCH cur_cid INTO cid; -> WHILE FOUND DO -> SET ROWS=ROWS+1; -> FETCH cur_cid INTO cid; -> END WHILE; -> CLOSE cur_cid; -> END$$ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near "ROWS INT)BEGINDECLARE cid INT;DECLARE FOUND BOOLEAN DEFAULT TRUE;DECLARE cur" at line 1mysql>mysql> CREATE PROCEDURE sp_sumofrow(OUT `ROWS` INT) BEGIN DECLARE cid INT; DECLARE FOUND BOOLEAN DEFAULT TRUE; DECLARE cur_cid CURSOR FOR SELECT cust_id FROM customers; DECLARE CONTINUE HANDLER FOR NOT FOUND SET FOUND=FALSE; SET `ROWS`=0; OPEN cur_cid; FETCH cur_cid INTO cid; WHILE FOUND DO SET `ROWS`=`ROWS`+1; FETCH cur_cid INTO cid; END WHILE; CLOSE cur_cid; END$$Query OK, 0 rows affected (0.01 sec)mysql>
然后,在 MySQL 命令行客户端输入如下 SQL语句对存储过程 sp_sumofrow 进行调用:
mysql> call sp_sumofrow(@rows); -> -> -> $$Query OK, 0 rows affected (0.01 sec)mysql> delimiter ;mysql> select @rows;+-------+| @rows |+-------+| 4 |+-------+1 row in set (0.00 sec)mysql>
最后,查看调用存储过程 sp_sumofrow后的结果:
mysql> select @rows;+-------+| @rows |+-------+| 4 |+-------+1 row in set (0.00 sec)mysql>
由此例可以看出:
- 定义了一个 CONTINUE HANDLER 句柄,它是在条件出现时被执行的代码,用于控制循环语句,以实现游标的下移
- DECLARE 语句的使用存在特定的次序,即用 DECLARE 语句定义的局部变量必须在定义任意游标或句柄之前定义,而句柄必须在游标之后定义,否则系统会出现错误信息。
在使用游标的过程中,需要注意以下几点:
- 游标只能用于存储过程或存储函数中,不能单独在查询操作中使用。
- 在存储过程或存储函数中可以定义多个游标,但是在一个 BEGIN...END 语句块中每一个游标的名字必须是唯一的。
- 游标不是一条 SELECT 语句,是被 SELECT 语句检索出来的结果集。
四、调用存储过程
CALL sp_name([parameter[,...]])CALL sp_name[()]
- 当调用没有参数的存储过程时,使用 CALL sp_name() 语句与使用 CALL sp_name 语句是相同的。
例子:调用数据库 mysql_test 中的存储过程 sp_update_sex,将客户 id 号位 909 的客户性别修改为男性“M”。
mysql> call sp_update_sex(909,"M");Query OK, 0 rows affected (0.00 sec)mysql>
五、删除存储过程
DROP PROCEDURE [IF EXISTS] sp_name
例子:删除数据库 mysql_test 中的存储过程 sp_update_sex。
mysql> DROP PROCEDURE sp_update_sex;Query OK, 0 rows affected (0.01 sec)mysql>
第二节 存储函数
存储函数与存储过程的区别:
- 存储函数不能拥有输出参数,这是因为存储函数自身就是输出参数;而存储过程可以拥有输出参数。
- 可以直接对存储函数进行调用,且不需要使用 CALL 语句;而对存储过程的调用,需要使用 CALL 语句。
- 存储函数中必须包含一条 RETURN 语句,而这条特殊的SQL语句不允许包含于存储过程中。
一、创建存储函数
CREATE FUNCTION sp_name ([func_parameter[,...]])RETURNS typeroutine_body
其中,语法项“func_parameter”的语法格式是:
param_name type
- 存储函数不能与存储过程具有相同的名字。
- 存储函数体中还必须包含一个 RETURN value 语句,其中 value 用于指定存储函数的返回值。
例子:在数据库 mysql_test 中创建一个存储函数,要求该函数能根据给定的客户 id 号返回客户的性别,如果数据库中没有给定的 id 号,则返回“没有该客户”。
➜ mysql -uroot -pEnter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 659Server version: 8.0.32 HomebrewCopyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type "help;" or "\h" for help. Type "\c" to clear the current input statement.mysql> use mysql_test;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> DELIMITER $$mysql> CREATE FUNCTION fn_search(cid INT) -> RETURNS CHAR(2) -> DETERMINISTIC -> BEGIN -> DECLARE SEX CHAR(2); -> SELECT cust_sex INTO SEX FROM customers -> WHERE cust_id=cid; -> IF SEX IS NULL THEN -> RETURN(SELECT "没有该客户"); -> ELSE IF SEX="F" THEN -> RETURN(SELECT "女"); -> ELSE RETURN(SELECT "男"); -> END IF; -> END IF; -> END $$Query OK, 0 rows affected (0.02 sec)mysql>
二、调用存储函数
SELECT sp_name ([func_parameter[,...]])
例子:调用数据库 mysql_test 中的存储函数 fn_search。
mysql> delimiter ;mysql> SELECT fn_search(904);+----------------+| fn_search(904) |+----------------+| 男 |+----------------+1 row in set (0.00 sec)mysql>
三、删除存储函数
DROP FUNCTION [IF EXISTS] sp_name
例子:删除数据库 mysql_test 中的存储函数 fn_search。
mysql> DROP FUNCTION IF EXISTS fn_search;Query OK, 0 rows affected (0.00 sec)mysql>
关键词:
-
-
-
-
混合多云第二课——混合技术如何每年为京东节省上亿元成本?
【天天新视野】记录--我在前端干工地(three.js)
数据库系统原理之数据库编程
当前滚动:债市日报:3月22日
女子应聘被HR质疑23岁用苹果手机:称其年纪小 手机贵
天天速讯:四川一高校放7天春假 鼓励大家去恋爱!网友:坚持一个四川原则
环球速递!腾讯2022年人均年薪102.5万!一年增加近20万
世界资讯:“长胡子”了 比亚迪海豚泰国版发布:售价约16万人民币
【全球新视野】被马化腾视为腾讯希望!微信视频号使用时长已超朋友圈
世界看热讯:农历中的惊蛰到底有什么寓意?
天天快讯:Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
ThreadPool实现机制
焦点热议:nodejs处理嵌套对象的npm包:dot-prop
中国西北地区发现广泛分布的侏罗纪被子植物化石
3年陈花香白牡丹:董德福鼎白茶200g装128元大促(200元券)
环球快看:188GB显存 800W功耗!NVIDIA发布H100 NVL加速卡:ChatGPT提速2倍
世界新资讯:美国两囚犯用牙刷挖洞越狱成功:墙内钢筋松了!职能部门颜面扫地
当前观察:9岁女孩豪掷18.9万打赏游戏主播 偷偷记下密码还删除转账记录
天天速讯:新能源汽车高速没电竟然倒车回服务区充电 后方车辆纷纷避让
Geyser - Minecraft Server 基岩版与Java版互通教程
世界速讯:Rust 知识积累(5)
全球热文:CSIG企业行-走进合合信息成功举行,聚焦生成式人工智能、智能文档处理前沿热点
环球今日讯!webrtc QOS笔记三 RTT计算,SRS增加XR
你可能不那么知道的Tomcat生命周期管理 | 博学谷狂野架构师
全球新资讯:国家药监局:2022年抽检11类化妆品20368批次产品 合格率97.60%
每日速看!【财经分析】投资收益拖累2022年券商业绩 投行业务景气度仍处于高位
【聚看点】澳弘电子(605058.SH):年产高精密度多层板、高密度互连积层板120万平方米建设项目及研发中心升级改造项目结项
真我GT Neo5 SE“最终幻想”配色回归:赛博朋克风满满
当前消息!《黑暗荣耀2》蝉联网飞电视剧全球榜第一:观看时间过亿
当前热门:又一日系即将退出中国?广汽三菱否认传闻:正常运转
世界看点:被谷歌商店下架 拼多多驳斥恶意软件指控!
世界聚焦:上市五年市值缩水99.6%!昔日“明星”趣头条宣布退市
新资讯:火山引擎 VeDI 零售行业解决方案 聚焦精准营销场景提升品牌转化
面试官:ThreadLocal 为什么会内存泄漏吗?是怎么产生的?面试必问!
JavaSE笔记之注解和反射(含案例代码)
当前速递!Android BLE 广播定制
环球报道:关于asp.net core filters生命周期的探究
今头条!北方多地迎沙尘!长春直接下“泥雨”:汽车变泥车
环球速讯:OPPO、小米、vivo联盟:跨品牌一键换机新增第三方应用迁移
最新消息:史上最强骁龙7系 真我GT Neo5 SE跑分过百万:16+1TB存储确认
世界今热点:孤立森林(IForest)代码实现及与PyOD对比
最资讯丨three.js加载环境贴图
天天热讯:java中同步和异步的区别
今日关注:Alphaliner:2月底港口停运船比率达6.4% 增至去年同期3倍
4月上映!《长空之王》新预告出炉:王一博驾驶歼20一飞冲天
世界今头条!自嗨锅自热煲仔饭4桶到手价32.8元:15分钟速烹美食
今年以来最强沙尘来袭!你的城市在下雨 他的城市在下泥
邓紫棋你把我灌醉高音最高是多少?邓紫棋你把我灌醉歌词
苏菲日记是什么?苏菲日记的读后感怎么写?
strict怎么读?strict的反义词是什么?
主题班会的开场白有什么要求?主题班会的开场白怎么写?
河南洛阳旅游景点排名前十名有哪些?河南洛阳美食排行榜前十名
当前简讯:一种基于实时大数据的图指标解决方案
【天天报资讯】智能零售柜商品检测软件(Python+YOLOv5深度学习模型+清新界面)
来了解下GNOME 2 的 Linux 文件管理器 Caja
【状压DP】蒙德里安的梦想
【环球新要闻】害怕开车也不愁 小米汽车新专利:根据驾驶员匹配自动驾驶等级
前沿资讯!漫威《美国队长4:新世界秩序》开拍 片场首曝:“猎鹰”美队来了
每日热门:一语成谶!网传鬼火少年“三部曲”:片头壮行、片尾撞车
俄罗斯伏尔加汽车厂:中国汽车是新款拉达Vesta的主要对手
省钱神器!淘宝内测同款比价功能:最快本周上线
全球速看:记一次 rr 和硬件断点解决内存踩踏问题
天天新资讯:生核桃怎么变熟核桃_生核桃怎么弄熟
魅族20 PRO三款配色公布:绝美朝阳金吸睛
天天快消息!25日继续公测 暴雪承诺《暗黑4》会解决排队问题:服务器顶得住
环球精选!沙尘天气席卷!北京再现火星同款“蓝太阳” 专家揭秘
世界即时:开特斯拉回村被乡亲群嘲“大冤种” 30万买BBA不好吗?
今日热门!微信聊天记录不用头疼了:vivo宣布跨品牌换机数据迁移
基于深度学习的安全帽检测系统(YOLOv5清新界面版,Python代码)
MAC 最新中文版 FCPX 10.6.5 及相关插件下载安装教程 亲测有效
大数据计算引擎 EasyMR:拥抱开源,引领技术创新
当前聚焦:Java面试问题
解放生产力:30+实用AI工具汇总
全球今日讯!谷歌版ChatGPT开放测试:不会编程、不支持中文
全球聚焦:微软研究员质疑Bard数据集包括Gmail邮件:谷歌迅速澄清
2999元 小米米家对开门540L冰箱今晚开售:风冷无霜保鲜
120mg原生高钙 特仑苏纯牛奶3元/盒大促
天天最新:破解大难题!苹果新专利:佩戴太阳镜也可看清iPhone屏幕内容
【报资讯】vue3
世界视点!设计模式-index
精彩看点:商铺上月买卖91宗 涉21亿创半年高
热点评!平板电脑屏幕冷知识:高刷比高分辨率重要
焦点热讯:比尔·盖茨:GPT是1980年以来最革命性的技术进步
今日热讯:极氪009平均订单金额达52.7万元 一台订单收入相当于吉利卖5台
谷歌版ChatGPT Bard开启公测!CEO:肯定会出错、欢迎反馈
世界焦点!漫威《美队4》正式开拍 首曝片场路透:猎鹰美队就位
世界热议:Android性能优化-ListView自适应性能问题
读C#代码整洁之道笔记03_切面关注点、异常处理和线程与并发
当前时讯:放假一天不调休!2023清明节假期火车票今日开售
快资讯丨《霍格沃茨》在线人数锐减 “反恐同”人士冷嘲热讽
环球今日讯!《战争机器》电影确定编剧
世界聚焦:刚买1个月的特斯拉掉漆车主质疑非新车 售后:交付时没问题
热消息:公交司机急刹车致乘客死亡获刑 官方判定当时不需刹车:交通肇事罪
全球最资讯丨新车品鉴:2020广州车展探馆:广汽传祺EMPOWER
每日热闻!【看新股】10家拟上市银行“换道”注册制:利润普遍增长、资产质量分化、资本充足率承压
精选!iOS 17将支持第三方应用商店:看齐安卓
读Java性能权威指南(第2版)笔记24_ Java飞行记录器JFR
洗衣机6个月不清洗比马桶还脏?我麻了
时代的眼泪 25年历史的数码相机权威网站Dpreview关停
当前快报:Go 并发编程(二):锁、Select、Context、定时器