实现代码的重用和集中管理。存储过程存储在数据库中,可以被重复调用,不同的应用可以共享存储过程;
实现业务的封装和隔离。应用程序通过接口访问存储过程;当业务发生变化时,只需要修改存储过程的逻辑,对应用程序毫无影响;
减少了应用与数据库之间的网络流量。调用存储过程时,只需要传递参数,在一定程度上可以减轻网络负担;
存储过程可以提高安全性。应用程序通过存储过程进行数据访问,而不需要直接访问数据表,保证数据的安全。
MySQL 存储过程的语法和其他数据库之间不兼容,无法直接移植;
存储过程需要占用数据库服务器的资源,包括 CPU、内存等。MySQL 对于大量逻辑处理的支持不够完善;
存储过程的开发和维护需要专业的技能。MySQL 存储过程不支持调试功能,增加了应用程序的开发和维护难度。
CREATE PROCEDURE sp_name (
[ IN | OUT | INOUT ] param_name data_type,
...)
routine_body;
DELIMITER $$CREATE PROCEDURE GetDevelopers()BEGIN
SELECT emp_name, sex, hire_date, salary, bonus, email FROM employee WHERE dept_id = 4; END$$DELIMITER ;
CALL GetDevelopers();emp_name|sex|hire_date |salary |bonus|email |--------|---|----------|--------|-----|-------------------|赵云 |男 |2005-12-19|15000.00| 0.00|zhaoyun@shuguo.com |廖化 |男 |2009-02-17| 6500.00| 0.00|liaohua@shuguo.com |关平 |男 |2011-07-24| 6800.00| 0.00|guanping@shuguo.com|赵氏 |女 |2011-11-10| 6600.00| 0.00|zhaoshi@shuguo.net |关兴 |男 |2011-07-30| 7000.00| 0.00|guanxing@shuguo.com|张苞 |男 |2012-05-31| 6500.00| 0.00|zhangbao@shuguo.com|赵统 |男 |2012-05-03| 6000.00| 0.00|zhaotong@shuguo.com|周仓 |男 |2010-02-20| 8000.00| 0.00|zhoucang@shuguo.com|马岱 |男 |2014-09-16| 5800.00| 0.00|madai@shuguo.com |
DELIMITER $$CREATE PROCEDURE GetEmpNumBySex (
IN psex VARCHAR(10),
OUT pnum INT)BEGIN
SELECT COUNT(1)
INTO pnum FROM employee WHERE sex = psex;END$$DELIMITER ;
CALL GetEmpNumBySex('女', @num);SELECT @num;@num|----|
6|
CREATE PROCEDURE sp_name (
[ IN | OUT | INOUT ] param_name data_type,
...)[COMMENT 'string'| LANGUAGE SQL| [NOT] DETERMINISTIC| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY { DEFINER | INVOKER }]
routine_body;
SHOW PROCEDURE STATUS
[LIKE 'pattern' | WHERE expr]
SHOW PROCEDURE STATUS WHERE name = 'GetDevelopers';Name |Value |--------------------|-------------------|Db |hrdb |Name |GetDevelopers |Type |PROCEDURE |Definer |root@% |Modified |2020-09-27 05:32:44|Created |2020-09-27 05:32:44|Security_type |DEFINER |Comment | |character_set_client|utf8mb4 |collation_connection|utf8mb4_0900_ai_ci |Database Collation |utf8mb4_0900_ai_ci |
SHOW CREATE PROCEDURE GetDevelopers;Name |Value |--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|Procedure |GetDevelopers |sql_mode |ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |Create Procedure |CREATE DEFINER=`root`@`%` PROCEDURE `GetDevelopers`()
BEGIN
SELECT emp_name, sex, hire_date, salary, bonus, email
FROM employee
WHERE dept_id = 4;
END|character_set_client|utf8mb4 |collation_connection|utf8mb4_0900_ai_ci |Database Collation |utf8mb4_0900_ai_ci |
ALTER PROCEDURE proc_nameCOMMENT 'string'| LANGUAGE SQL| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY { DEFINER | INVOKER }
DROP PROCEDURE [IF EXISTS] sp_name;
DROP PROCEDURE IF EXISTS GetDevelopers;
CREATE FUNCTION sp_name (
param_name data_type,
...)RETURNS data_type
routine_body;
DELIMITER $$CREATE FUNCTION add2(
p1 int,
p2 int)RETURNS intDETERMINISTICBEGIN
RETURN p1 + p2;END $$DELIMITER ;
SELECT add2(2, 3);add2(2, 3)|----------|
5|
SHOW FUNCTION STATUS WHERE name = 'add2';Name |Value |--------------------|-------------------|Db |hrdb |Name |add2 |Type |FUNCTION |Definer |root@% |Modified |2020-09-27 07:01:38|Created |2020-09-27 07:01:38|Security_type |DEFINER |Comment | |character_set_client|utf8mb4 |collation_connection|utf8mb4_0900_ai_ci |Database Collation |utf8mb4_0900_ai_ci |
ALTER FUNCTION proc_nameCOMMENT 'string'| LANGUAGE SQL| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }| SQL SECURITY { DEFINER | INVOKER }
DROP FUNCTION [IF EXISTS] sp_name;
DROP FUNCTION IF EXISTS add2;
原文作者:SQL编程思想;如有侵权,请联系管理员删除。