0

0

MYSQL存储过程和存储函数怎么使用

WBOY

WBOY

发布时间:2023-06-03 16:55:21

|

1359人浏览过

|

来源于亿速云

转载

1. 什么是存储过程和存储函数

  • 存储过程(stored procedure)是一组sql语句的集合,这些语句被存储在数据库中。通过封装业务逻辑,存储过程可以提高数据库执行效率和数据访问的安全性。

  • 存储函数(Stored Function)是指在一个数据库中存储的一组执行SQL语句的集合,与存储过程的区别在于,存储函数有一个返回值。

2. 创建存储过程

CREATE PROCEDURE procedure_name([IN/OUT] parameter_name data_type)
BEGIN
    SQL Statement;
END;

假设我们已经有一张名为employee的员工表,现在需要创建一个存储过程,可以根据员工的工号查询员工的姓名和工资:

DELIMITER //
CREATE PROCEDURE get_employee_info_by_id(IN emp_id INT)
BEGIN
    SELECT name, salary FROM employee WHERE id = emp_id;
END //
DELIMITER ;

3. 创建存储函数

CREATE FUNCTION function_name([IN/OUT] parameter_name data_type) RETURNS data_type
BEGIN
    DECLARE variable_name data_type;
    SQL Statement;
    RETURN variable_name;
END;

假设我们已经有一张名为product的商品表,现在需要创建一个存储函数,可以根据商品的编号查询商品的单价:

DELIMITER //
CREATE FUNCTION get_product_price_by_id(IN product_id INT) RETURNS DECIMAL(10,2)
BEGIN
    DECLARE price DECIMAL(10,2);
    SELECT unit_price INTO price FROM product WHERE id = product_id;
    RETURN price;
END //
DELIMITER ;

4. 存储过程和存储函数的使用

  • 调用存储过程:

CALL procedure_name([parameter_name]);
  • 调用存储函数:

SELECT function_name([parameter_name]);

使用上面创建的get_employee_info_by_id存储过程可以这样调用:

CALL get_employee_info_by_id(1);

使用上面创建的get_product_price_by_id存储函数可以这样调用:

SELECT get_product_price_by_id(1001);

以下是一些常见的存储过程和存储函数的示例:

诚石C2C交易系统
诚石C2C交易系统

1. 页面全部经过SEO(搜索引擎优化)处理 2. 支持IE、FireFox等主流浏览器,在IE 和FireFox下显示相同的效果 3. 符合W3C国际网页标准,页面全部采用DIV+CSS布局 4. 采用SQL server数据库,所有数据库操作采用存储过程 5. 部分功能采用AJAX技术,良好的用户体验。 6. 后台集成在线HTML编辑软件FCKEditor,自定义美观的内容

下载

5. 带有if语句的存储过程

假设我们已经有一张名为employee的员工表,现在需要创建一个存储过程,查询员工的姓名和工资,如果工资大于5000,则在结果中添加一个备注:“高收入”。

DELIMITER //
CREATE PROCEDURE get_employee_info_with_note()
BEGIN
    SELECT name, salary, IF(salary > 5000, '高收入', '') AS note FROM employee;
END //
DELIMITER ;

6. 带有循环语句的存储过程

假设我们已经有一张名为product的商品表,现在需要创建一个存储过程,把商品的单价全部乘以1.1。

DELIMITER //
CREATE PROCEDURE update_all_product_price()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE pid INT;
    DECLARE price DECIMAL(10,2);
    DECLARE cur CURSOR FOR SELECT id, unit_price FROM product;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO pid, price;
        IF done THEN
            LEAVE read_loop;
        END IF;
        UPDATE product SET unit_price = price * 1.1 WHERE id = pid;
    END LOOP;
    CLOSE cur;
END //
DELIMITER ;

7. 带有事务的存储过程

假设我们已经有一张名为order的订单表和一张名为order_item的订单详情表,现在需要创建一个存储过程,向这两张表中插入一条记录。

DELIMITER //
CREATE PROCEDURE insert_order(IN order_id INT, IN item_name VARCHAR(50), IN item_price DECIMAL(10,2), IN item_quantity INT)
BEGIN
    START TRANSACTION;
    INSERT INTO `order`(id) VALUES(order_id);
    SET @last_order_id = LAST_INSERT_ID();
    INSERT INTO order_item(order_id, item_name, item_price, item_quantity) VALUES(@last_order_id, item_name, item_price, item_quantity);
    COMMIT;
END //
DELIMITER ;

8. 带有游标的存储函数

假设我们已经有一张名为product的商品表,现在需要创建一个存储函数,查询商品表中的最大单价。

DELIMITER //
CREATE FUNCTION get_max_product_price() RETURNS DECIMAL(10,2)
BEGIN
    DECLARE max_price DECIMAL(10,2);
    DECLARE cur CURSOR FOR SELECT unit_price FROM product;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET max_price = 0;
    OPEN cur;
    FETCH cur INTO max_price;
    read_loop: LOOP
        FETCH cur INTO max_price;
        IF max_price IS NULL THEN
            LEAVE read_loop;
        END IF;
        IF max_price > @max_price THEN 
            SET @max_price = max_price;
        END IF;
    END LOOP;
    CLOSE cur;
    RETURN max_price;
END //
DELIMITER ;

9. 存储过程和存储函数的优点

  • 代码可以重复使用,避免重复编写SQL语句;

  • 在存储过程和存储函数中可以使用流程控制语句,处理复杂逻辑;

  • 通过存储过程和存储函数可以对数据库操作进行封装,提高效率和安全性。

相关专题

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

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

4

2026.01.16

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

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

3

2026.01.16

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

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

10

2026.01.16

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

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

33

2026.01.15

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

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

15

2026.01.15

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

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

42

2026.01.15

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

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

7

2026.01.15

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

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

9

2026.01.15

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

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

6

2026.01.15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 793人学习

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

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