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

网友投稿 773 2023-07-01

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

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

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_typeBEGIN 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);登录后复制

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

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语句;在存储过程和存储函数中可以使用流程控制语句,处理复杂逻辑;通过存储过程和存储函数可以对数据库操作进行封装,提高效率和安全性。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:CentOS怎么编译安装Nginx1.10.3+MySQL5.7.16+PHP7.1.2
下一篇:SQL中如何使用WHERE子句规定选择的标准
相关文章