前言
最新项目开发中,需要写存储过程。觉得有必要记录一下。因为开发需要,去学习的存储过程。
1. 储存过程的优缺点
优点
- 存储过程可封装,并隐藏复杂的商业逻辑。
- 存储过程可以回传值,并可以接受参数。
- 存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
- 存储过程可以用在数据检验,强制实行商业逻辑等
缺点
1)存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
2) 存储过程的性能调校与撰写,受限于各种数据库系统。
2. 基本语法
1) 创建储存过程
CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 …] 过程体
DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER ;
DELIMITER(分割符)
MySQL默认以";“为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个”//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。
写一段样例 (不区分大小写)
这是一个 求 1+2+3+…+n 。写一个存储过程,并打印结果。
--- 代码1
DELIMITER //
CREATE PROCEDURE addresult()
BEGIN
DECLARE i INT;
DECLARE sum INT;
DECLARE n INT;
SET i=0;
SET sum=0;
WHILE i<= n DO
SET sum=sum+i;
SET i=i+1;
END WHILE;
SELECT sum;
END
// DELIMITER;
-- 代码2 这个是调用写的储存过程,首先要执行以下代码1,才可以调用。
call addresult;
MYSQL 存储过程中的关键语法
1、声明语句结束符,可以自定义:
DELIMITER $$
或
DELIMITER //
2、存储过程开始和结束符号:
BEGIN .... END
3、变量赋值:
SET @p_in=1
4、变量定义:
DECLARE l_int int unsigned default 4000000;
5、创建mysql存储过程、存储函数:
create procedure 存储过程名(参数)
6、存储过程体:
create function 存储函数名(参数)
样例参考:
2)调用存储过程
1.基本语法:call sp_name()
注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递
3)删除存储过程
1.基本语法:
drop procedure sp_name//
2.注意事项
(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
4)常用查询操作
1.show procedure status
显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
2.show create procedure sp_name
显示某一个mysql存储过程的详细信息
3、存储过程的查询
selectname from mysql.proc where db='数据库名';
或者
selectroutine_name from information_schema.routines where routine_schema='数据库名';
或者
showprocedure status where db='数据库名';