0

0

mysql 使用存储过程

王林

王林

发布时间:2023-05-20 10:25:37

|

1426人浏览过

|

来源于php中文网

原创

mysql 是当前最普及的一种关系型数据库管理系统,其使用存储过程是为了更好地维护和管理 sql 语句和程序的执行。存储过程是一种预编译的 sql 代码块,可以将常用的 sql 语句封装起来,在多次执行时提高效率,降低运行时的资源占用。

MySQL 中存储过程的使用

1、创建存储过程

从根本上来说,创建一个存储过程就是编写一个 SQL 语句块,以及在系统数据库中保存这个代码块。下面是一个具体的例子:

CREATE PROCEDURE `procedure_name` (`parameter_list`)
BEGIN
    -- SQL 语句块
END

其中,procedure_name 是存储过程的名称,paramter_list 是存储过程的参数列表,可以包括入参、出参,也可以不包含参数。

例如,我们创建一个获取用户信息的存储过程:

CREATE PROCEDURE `get_user_info`(user_id INT)
BEGIN
    SELECT * FROM `user` WHERE `user_id` = user_id;
END

在存储过程的 SQL 语句块中,我们可以使用 MySQL 支持的所有 SQL 语句,如 SELECT、INSERT、UPDATE、DELETE 等,还可以使用控制流语句,例如 IF、WHILE、LOOP 等,从而实现更复杂的数据逻辑处理。

2、调用存储过程

创建存储过程之后,我们可以通过 CALL 语句来调用存储过程,并向其传递参数:

CALL procedure_name(param1, param2, ...)

例如,我们可以按如下方式调用上面定义的 get_user_info 存储过程:

CALL `get_user_info`(1);

3、删除存储过程

知我AI
知我AI

一款多端AI知识助理,通过一键生成播客/视频/文档/网页文章摘要、思维导图,提高个人知识获取效率;自动存储知识,通过与知识库聊天,提高知识利用效率。

下载

如果随着时间的推移,一个存储过程已经不再需要,可以使用 DROP PROCEDURE 语句删除它:

DROP PROCEDURE `procedure_name`;

例如:

DROP PROCEDURE `get_user_info`;

4、存储过程实例

我们来看一个完整的存储过程实例。假设我们有一个 score 表,存储了学生的考试成绩,而我们需要计算出每个学生的总分、平均分,并按照总分从高到低排列。这时可以使用存储过程来实现:

CREATE PROCEDURE `calc_stu_score`()
BEGIN
     DECLARE `total_score` INT;
     DECLARE `avg_score` FLOAT;
     DECLARE `stu_id` INT DEFAULT 0;
     DECLARE `stu_name` VARCHAR(255);
     DECLARE `total` INT DEFAULT 0;
    DECLARE `cursor_stu_id` CURSOR FOR SELECT `stu_id` FROM `score` GROUP BY `stu_id`;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE;

    DROP TEMPORARY TABLE IF EXISTS `tmp_score`;
    CREATE TEMPORARY TABLE `tmp_score` (
        `stu_id` INT NOT NULL,
        `stu_name` VARCHAR(255) NOT NULL,
        `total_score` INT NOT NULL,
        `avg_score` FLOAT NOT NULL,
        PRIMARY KEY (`stu_id`)
    );

    OPEN cursor_stu_id;

    stu_loop: LOOP
        FETCH cursor_stu_id INTO stu_id;
        IF finished = TRUE THEN 
            LEAVE stu_loop;
        END IF;

        SELECT `name` INTO stu_name FROM `student` WHERE `stu_id` = stu_id;

        SELECT SUM(`sorce`), COUNT(*) INTO total_score, total FROM `score` WHERE `stu_id` = stu_id;

        SET avg_score = total_score / NULLIF(total, 0);

        INSERT INTO `tmp_score` (`stu_id`, `stu_name`, `total_score`, `avg_score`) VALUES (stu_id, stu_name, total_score, avg_score);

    END LOOP;

    CLOSE cursor_stu_id;

    SELECT * FROM `tmp_score` ORDER BY `total_score` DESC;

    DROP TEMPORARY TABLE `tmp_score`;

END

在这个存储过程中,我们首先定义了一些需要使用的变量,包括 total_score 表示某个学生的总分,avg_score 表示某个学生的平均分,stu_id 表示某个学生的编号,stu_name 表示某个学生的姓名,还有一个临时表 tmp_score

然后我们使用了 DECLARE CURSOR 语句声明了一个游标变量 cursor_stu_id,用于查询学生表中的学生编号。在循环中,我们根据这个学生编号查询成绩表,计算出该学生的总分和平均分,并将其保存到临时表中。最后,我们使用 SELECT 语句查询临时表,按照总分从高到低排序,并在最后使用 DROP TABLE 语句删除临时表。

最后,我们可以使用 CALL 语句来调用这个存储过程:

CALL `calc_stu_score`();

总结

存储过程是 MySQL 中一种非常强大的工具,它可以大大简化我们的数据库操作过程,并提高数据库的性能和安全性。在实际应用中,我们可以使用存储过程来完成很多复杂的数据处理操作,从而更好地满足业务需求,提高效率,降低成本。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

132

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

54

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

85

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

43

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

11

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

49

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号