1月阅读周·MySQL数据库入门:存储过程的创建之创建存储过程篇

举报
叶一一 发表于 2025/01/24 11:40:17 2025/01/24
【摘要】 背景去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。没有计划的阅读,收效甚微。新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十二个月。已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScr...

背景

去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。

没有计划的阅读,收效甚微。

新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。

这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十二个月。

已读完书籍《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》、《JavaScript权威指南》、《JavaScript异步编程设计快速响应的网络应用》、《编写可测试的JavaScript代码

当前阅读周书籍MySQL数据库入门

创建存储过程

想要使用存储过程,首先要创建一个存储过程。创建存储过程,需要使用CREATE PROCEDURE语句,创建存储过程的基本语法格式如下:

CREATE PROCEDURE sp_name([proc_parameter])
[characteristics…]routine_body

上述语法格式中,CREATE PROCEDURE为用来创建存储过程的关键字;sp_name为存储过程的名称;proc_parameter为指定存储过程的参数列表,该参数列表的形式如下:

[IN|OUT|INOUT]param_name type

上述参数列表的形式中,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型,它可以是MySQL数据库中的任意类型。

在创建存储过程的语法格式中,characteristics用于指定存储过程的特性,它的取值说明具体如下。

(1)LANGUAGE SQL:说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL,SQL是LANGUAGE的唯一值。

(2)[NOT]DETERMINISTIC:指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出;NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT DETERMINISTIC。

(3){CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}:指明子程序使用SQL语句的限制。CONTAINS SQL表明子程序包含SQL语句,但是不包含读写数据的语句;NO SQL表明子程序不包含SQL语句;READS SQL DATA说明子程序包含读写数据的语句;MODIFIES SQL DATA表明子程序包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。

(4)SQL SECURITY{DEFINER|INVOKER}:指明谁有权限来执行。DEFINER表示只有定义者才能执行。INVOKER表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER。

(5)COMMENT‘string’:注释信息,可以用来描述存储过程。

routime_body是SQL代码的内容,可以用BEGIN…END来表示SQL代码的开始和结束。

接下来通过一个案例演示一下存储过程的创建,首先在数据库chapter06中创建表student,创建student表的SQL语句如下所示:

USE chapter06;
CREATE TABLE student(
id INT(3) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
grade FLOAT,
gender CHAR(2)
);

执行上述SQL语句创建student表,然后使用INSERT语句向student表中插入4条记录,INSERT语句如下所示:

INSERT INTO student(name,grade,gender)
VALUES('tom',60,'男'),
('jack',70,'男'),
('rose',90,'女'),
('lucy',100,'女');

【例1-1】创建一个查看student表的存储过程,其创建语句如下:

CREATE PROCEDURE Proc()
BEGIN
SELECT * FROM student;
END;

上述代码创建了一个存储过程Proc,每次调用这个存储过程的时候都会执行SELECT语句查看表的内容,代码的执行过程如下:

mysql>DELIMITER //
mysql>CREATE PROCEDURE Proc ()
->BEGIN
->SELECT * FROM student;
->END //
Query OK, 0 rows affected (0.00 sec)
mysql>DELIMITER;

在上述执行过程中,“DELIMITER //”语句的作用是将MySQL的结束符设置为//,因为MySQL默认的语句结束符号为分号“;”,为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符,并以“END //”结束存储过程。存储过程定义完毕后再使用“DELIMITER ;”恢复默认结束符。DELIMITER也可以指定其他符号作为结束符。需要格外注意的是,DELIMITER与要设定的结束符之间一定要有一个空格,否则设定无效。

总结

在开发过程中,经常会遇到重复使用某一功能的情况,为此,MySQL引入了存储过程。存储过程就是一条或多条SQL语句的集合,当对数据库进行一系列复杂操作时,存储过程可以将这些复杂操作封装成一个代码块,以便重复使用,大大减少数据库开发人员的工作量。

想要使用存储过程,首先要创建一个存储过程。创建存储过程,需要使用CREATE PROCEDURE语句。


作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏️ | 留言📝

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。