Mysql 存储过程

存储过程和存储函数就是对数据库操做过程当中对于反复操做或者比较复杂的sql语句,做成一个方法,能够反复使用。
方法就是函数 function , 有输入、有输出 ,好像没有回调。
这就是同php 同样,把MySQL看成是一门语言来看了,存储过程的语法以下:php


1mysql

2sql

3数据库

4ide

5函数

6spa

7code

8orm

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;.

相关文章
相关标签/搜索