MySQL從5.0開始才引入預存程序,反正以前做應用的時候從沒碰過,不過現在因為主要作內部系統,所以很多應用都用到了預存程序,當然前台有時候也需要調用MySQL預存程序,PHP的MySQL Lib好像支援的不是很好,不過我搜尋了些資料,雖然不多,但是還是嘗試的使用了,現在介紹一下方法
1。調用預存程序的方法。
a。如果預存程序有 IN/INOUT參數,聲明一個變數,輸入參數給預存程序,該變數是一對,一個php變數(也可以不必,只是沒有php變數時,沒有辦法進行動態輸入),一個Mysql變數。
b。如果預存程序有OUT變數,聲明一個Mysql變數。mysql變數的聲明比較特殊,必須讓mysql伺服器知道此變數的存在,其實也就是執行一條mysql語句。入set @mysqlvar=$phpvar ;
c。使用mysql_query()/mysql_db_query()執行mysql 變數聲明語句。
代碼如下 |
複製代碼 |
mysql_query("set @mysqlvar【=$pbpvar】"); |
這樣,在mysql伺服器裡面就有一個變數,@mysqlar。如果時IN參數,那麼其值可以有phpar傳入。
d。 如果時預存程序。
1。執行 call procedure()語句。
也就是mysql_query("call proceduer([var1]...)");
2. 如果有傳回值,執行select @ar,返回執行結果。
代碼如下 |
複製代碼 |
mysql_query("select @var)" |
接下來的操作就和php執行一般的mysql語句一樣了。可以通過mydql_fetch_row()等函數獲得結果。
下面我總結了一些調用預存程序的執行個體無參的預存程序
代碼如下 |
複製代碼 |
$conn = mysql_connect('localhost','root','root') or die ("資料連線錯誤!!!"); mysql_select_db('test',$conn); $sql = " create procedure myproce() begin INSERT INTO user (id, username, sex) VALUES (NULL, 's', '0'); end; "; mysql_query($sql);//建立一個myproce的預存程序
$sql = "call test.myproce();"; mysql_query($sql);//調用myproce的預存程序,則資料庫中將增加一條新記錄。 |
型一:調用帶輸入、輸出型別參數的方法
代碼如下 |
複製代碼 |
$returnValue = ''; try { mysql_query ( "set @Return" ); $spname = 'P__Test_GetInfo1'; mysql_query ( "call $spname(@Return, '{$userId}', '{$pwd}')" ) or die ( "[$spname]Query failed:" . mysql_error () ); $result_return = mysql_query ( "select @Return" ); $row_return = mysql_fetch_row ( $result_return ); $returnValue = $row_return [0]; } catch ( Exception $e ) { echo $e; } echo $returnValue; //輸出來自預存程序中輸出的變數 |
類型二:調用帶多個輸出類型和多個輸入型別參數的方法
代碼如下 |
複製代碼 |
$userId = 0; try{ mysql_query("set @Message"); mysql_query("set @Id"); mysql_query("call P__Test_Login(@Message, @Id, '{$userId}', '{$pwd}')", $conn) or die("Query failed:".mysql_error()); $result_mess = mysql_query("select @Message"); $result_uid = mysql_query("select @Id"); $row_mess = mysql_fetch_row($result_mess); $row_uid = mysql_fetch_row($result_uid); $Proc_Error = $row_mess[0]; $uId = $row_uid[0]; } catch( Exception $e ) { echo $e; } echo 'proc return message:'$Proc_Error.'<br/>'; //輸出來自預存程序中輸出的變數 echo 'User id:'.$uId; //擷取使用者id |
類型三:調用帶返回結果集的方法
代碼如下 |
複製代碼 |
try { $spname = 'P__Test_GetData'; $query = mysql_query ( "call $spname()", $conn ) or die ( "[$spname]Query failed:".mysql_error() ); while ( $row = mysql_fetch_array ( $query ) ) { echo $row ['ProvinceID'].'::'.$row ['ProvinceName']; //輸出資料集 } } catch ( Exception $e ) { echo $e; } |
類型四:調用帶返回多個結果集的方法(目前只能通過mysqli來實現~~)
代碼如下 |
複製代碼 |
//PHP $rows = array (); $db = new mysqli($server,$user,$psd,$dbname); if (mysqli_connect_errno()){ $this->message('Can not connect to MySQL server'); } $db->query("SET NAMES UTF8"); $db->query("SET @Message"); if($db->real_query("call P__Test_GetData2(@Message)")){ do{ if($result = $db->store_result()){ while ($row = $result->fetch_assoc()){ array_push($rows, $row); } $result->close(); } }while($db->next_result()); } $db->close(); print_r($rows); //Procedure …… select * from T1 where …… select * from T2 where …… …… |
執行個體四:傳出參數的inout預存程序
代碼如下 |
複製代碼 |
$sql = " create procedure myproce4(inout sexflag int) begin SELECT * FROM user WHERE sex = sexflag; end; "; mysql_query($sql);//建立一個myproce4的預存程序 $sql = "set @sexflag = 1"; mysql_query($sql);//設定性別參數為1 $sql = "call test.myproce4(@sexflag);"; mysql_query($sql);//調用myproce4的預存程序,在cmd下面看效果 |
執行個體五:使用變數的預存程序
代碼如下 |
複製代碼 |
$sql = " create procedure myproce5(in a int,in b int) begin declare s int default 0; set s=a+b; select s; end; "; mysql_query($sql);//建立一個myproce5的預存程序 $sql = "call test.myproce5(4,6);"; mysql_query($sql);// |
調用myproce5的預存程序,在cmd下面看效果
執行個體六:case文法
代碼如下 |
複製代碼 |
$sql = " create procedure myproce6(in score int) begin case score when 60 then select '及格'; when 80 then select '及良好'; when 100 then select '優秀'; else select '未知分數'; end case; end; "; mysql_query($sql);//建立一個myproce6的預存程序 $sql = "call test.myproce6(100);"; mysql_query($sql);// |
調用myproce6的預存程序,在cmd下面看效果
執行個體七:迴圈語句
代碼如下 |
複製代碼 |
$sql = " create procedure myproce7() begin declare i int default 0; declare j int default 0; while i<10 do set j=j+i; set i=i+1; end while; select j; end; "; mysql_query($sql);//建立一個myproce7的預存程序 $sql = "call test.myproce7();"; mysql_query($sql);// |
調用myproce7的預存程序,在cmd下面看效果
執行個體八:repeat語句
代碼如下 |
複製代碼 |
$sql = " create procedure myproce8() begin declare i int default 0; declare j int default 0; repeat set j=j+i; set i=i+1; until j>=10 end repeat; select j; end; "; mysql_query($sql);//建立一個myproce8的預存程序 $sql = "call test.myproce8();"; mysql_query($sql);// |
調用myproce8的預存程序,在cmd下面看效果
執行個體九:loop語句
代碼如下 |
複製代碼 |
$sql = " create procedure myproce9() begin declare i int default 0; declare s int default 0; loop_label:loop set s=s+i; set i=i+1; if i>=5 then leave loop_label; end if; end loop; select s; end; "; mysql_query($sql);//建立一個myproce9的預存程序 $sql = "call test.myproce9();"; mysql_query($sql);// |
調用myproce9的預存程序,在cmd下面看效果
執行個體十:刪除預存程序
代碼如下 |
複製代碼 |
mysql_query("drop procedure if exists myproce");//刪除test的預存程序 |
執行個體十:預存程序中的遊標