存储过程和存储函数就是对数据库操作过程中对于反复操作或者比较复杂的sql语句,作成一个方法,可以反复使用。
方法就是函数 function , 有输入、有输出 ,好像没有回调。
这就是同php 一样,把MySQL当作是一门语言来看了,存储过程的语法如下:
1 2 3 4 5 6 7 8 9 10 |
DELIMITER // 分隔符 create procedure simpleproc(IN id int,OUT result1 varchar(100)) //建立储存过程 simpleproc (传入值 名称 类型 ,输出值 名称 类型) BEGIN //开始 select field1,field2 into x,y from table where id=id; //选择字段1,字段2 into 结果1,结果2,从表名,where 条件。 END // DELIMITER ; //结束
call simpleproc(1,@a); //传入值 为1 , 结果返回到@a @a 就是output. select @a; // 得到@a 的值 |
这个方法是没有return 的,因为不是函数,是不是?
1 2 3 4 5 6 7 8 9 10 11 |
function simpleproc($in) { $a = mysql_query("select xing_ming from xue_sheng where xue_sheng.id=".$in.";"); if($a){ return $a }else{ return false; }
} |
例:
存储函数里面声明变量和赋值,逻辑判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
drop procedure if exists s3; //如果这个存储过程存在的话,则先删除
delimiter // create procedure s3(IN id int(10),OUT result_1 varchar(150)) begin declare temp_1 int; declare temp_2 int default 1000; declare mname varchar(25); select balance,name into temp_1,mname from member where mid=id; if temp_1 >= temp_2 then set result_1 =concat(mname,'大款'); else set result_1 = '穷人'; end if; end // delimiter ;
call s3(1,@a); call s3(2,@b); call s3(3,@c); select @a; select @b; select @c; |
这样写就完全不需要php来写了,php 只需要mysql_query(“call simpleproc( ‘张三’ ,@a)”) ; 是不是呢?
网上找了存储过程例子,两个存储过程,第二个调用第一个。
第一个是对班级的判断,第二个是插入学生信息。
第二个存储过程中调用了第一个储存过程,并返回值(班级) 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
DROP PROCEDURE IF EXISTS `P_GET_CLASS_NAME`; CREATE PROCEDURE P_GET_CLASS_NAME(IN ID int,OUT NAME VARCHAR(50)) BEGIN IF(ID = 1) THEN SET NAME = '一班'; END IF; IF(ID = 2) THEN SET NAME = '二班'; END IF; END;
DROP PROCEDURE IF EXISTS `P_INSERT_STUDENT`; CREATE PROCEDURE P_INSERT_STUDENT(IN ID INT,IN NAME VARCHAR(10),IN CLASSNO INT,IN BIRTH DATETIME) BEGIN SET @ID = ID; SET @NAME = NAME; SET @CLASSNO = CLASSNO; SET @BIRTH = BIRTH; SET @CLASSNAME = NULL; CALL P_GET_CLASS_NAME(@CLASSNO,@CLASSNAME);
SET @insertSql = CONCAT('INSERT INTO TBL_STUDENT VALUES(?,?,?,?)'); //合并sql 语句 PREPARE stmtinsert FROM @insertSql; EXECUTE stmtinsert USING @ID,@NAME,@CLASSNAME,@BIRTH; //给sql 语句值 DEALLOCATE PREPARE stmtinsert; //这是释放资源了 ,上一句的值 END;
CALL P_INSERT_STUDENT(1,'xy',1,'2012-10-01 10:20:01'); |
显示当前所有存储过程:
#show procedure status;
在PHPmyadmin 中也可以查看,
# drop procedure 存储过程名称;
一旦退出当前mysql ,存储过程还存在,但是call 的结果不在了,也就是@a ,需要重新call 一次,然后再select;.