MySQL5.0版本开始支持存储过程
简介
存储过程 (Stored Procedure) 是一种在数据库中存储复杂程序,以便在外部程序调用的一种数据库对象
SQL语句需要先编译然后执行,而存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。
存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定的功能时,存储过程是非常有用的。数据可中的存储过程可以看作是对编程中面向对象方法的模拟,它允许控制数据的访问方式。
存储过程的创建和调用
存储过程就是具有名字的一段代码,用来完成一个特定的功能。
创建的存储过程保存在数据库的数据字典中。
创建存储过程语法结构如下:
create procedure 名称()
begin
.........
end
MYSQL存储过程中的关键语法
1. 声明语句结束符,可以自定义: DELIMITER $$ 或 DELIMITER //
MYSQL默认以“;”为分隔符,如果没有声明分隔符,则编译器会把存储过程当成sql语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER &&”或“DELIMITER //”声明当前段分隔符,让编译器把两个“&&”或“//”之间的内容当作存储过程的代码,不会执行这些代码 ; “DELIMITER ;”意为把分隔符还原
2. 声明存储过程: CREATE PROCEDURE demo_in_parameter (IN p_in int)
存储过程根据需要可能会有输入,输出,输入输出参数,如果有多个参数用“,”分割。MYSQL存储过程的参数用在存储过程的定义,共有三种类型, IN, OUT, INOUT
3. 存储过程开始或结束符号:BEGIN...END
4. 变量赋值:SET @p_in = 1
5. 变量定义:DECLARE l_int int unsigned default 4000000;
6. 创建mysql存储过程,存储函数:create procedure 存储过程名(参数)
7. 存储过程体:create function 存储函数名(参数)
在默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀。在定义过程时,使用 DELIMITER $$ 命令将语句的结束符号从分号 ; 临时改为两个 $$,使得过程体中使用的分号被直接传递到服务器,而不会被客户端(如mysql)解释。
调用过程:call sp_name[(传参)]
存储过程体:
存储过程体包含了在过程调用时必须执行的语句,例如:dml, ddl语句,if-then-else语句和while-do语句,声明变量的declare语句等
过程体格式:以begin开始,以end结束(可嵌套)
BEGIN
BEGIN
BEGIN
statements;
END
END
END
注意:每个嵌套块及其中的每条语句,必须以分号结束,表示过程体结束的begin-end块(又叫复合语句),则不需要分号
为语句块贴标签:
[begin_label:] BEGIN
[statement_list]
END [end_label]
标签的两个作用:
1. 增强代码的可读性
2. 在某些语句(例如:leave和iterate语句),需要用到标签
用户变量
在MySQL客户端使用用户变量:
SELECT 'Hello World' into @x;
SET @y='Goodbye Cruel World';
SET @z=1+2+3;
在存储过程中使用用户变量
CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');
SET @greeting='Hello';
CALL GreetWorld( );
在存储过程间传递全局范围的用户变量
CREATE PROCEDURE p1() SET @last_procedure='p1';
CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure);
CALL p1( );
CALL p2( );
注意:
1. 用户变量名一般以@开头
2. 滥用用户变量会导致程序难以理解及管理
MySQL存储过程的查询
select name from mysql.proc where db='数据库名';
select routine_name from information_schema.routines where routine.schema = '数据库名';
show procedure status where db='数据库名';
查看存储过程的详细
show create procedure laravel.proc1
网友评论