存儲過程和存儲函數就是對數據庫操做過程當中對於反覆操做或者比較複雜的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;.