mysql預存程序:首先操作資料庫語言SQL語句在執行的時候需要先編譯;然後執行,而預存程序是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者透過指定預存程序的名字並給定參數來呼叫執行它。
#更多相關免費學習推薦:mysql教學
# #(影片)
預存程序簡介
我們常用的操作資料庫語言SQL語句在執行的時候需要先編譯,然後再執行,而預存程序(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者透過指定預存程序的名字並給定參數(如果該預存程序帶有參數)來調用執行它。
一個預存程序是一個可編程的函數,它在資料庫中建立並保存。它可以有SQL語句和一些特殊的控制結構組成。當希望在不同的應用程式或平台上執行相同的函數,或封裝特定功能時,預存程序是非常有用的。資料庫中的預存程序可以看做是對程式設計中物件導向方法的模擬。它允許控制資料的存取方式。
預存程序通常有以下優點:預存程序增強了SQL語言的功能和彈性。預存程序可以用流控制語句編寫,具有很強的彈性,可以完成複雜的判斷和較複雜的運算。
預存程序允許標準元件是程式設計。預存程序被建立後,可以在程式中被多次調用,而不必重新編寫該預存程序的SQL語句。而且資料庫專業人員可以隨時對預存程序進行修改,對應用程式原始碼毫無影響。 預存程序能達到較快的執行速度。如果某一操作包含大量的Transaction-SQL程式碼或分別被多次執行,那麼預存程序要比批次的執行速度快很多。因為預存程序是預編譯的。在首次運行預存程序時查詢,優化器對其進行分析優化,並且給出最終被儲存在系統表中的執行計劃。而批次的Transaction-SQL語句在每次執行時都要進行編譯和最佳化,速度相對要慢一些。
預存程序能過度減少網路流量。針對同一個資料庫物件的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織程預存過程,那麼當在客戶電腦上呼叫該預存程序時,網路中傳送的只是該調用語句,從而大大增加了網路流量並降低了網路負載。
預存程序可被當作一種安全機制來充分利用。系統管理員透過執行某一預存程序的權限進行限制,能夠實現對對應的資料的存取權限的限制,避免了非授權使用者對資料的訪問,保證了資料的安全。
關於MySQL的預存程序預存程序是資料庫儲存的一個重要的功能,但MySQL在5.0以前不支援預存程序,這使得MySQL在應用上大打折扣。還好MySQL 5.0終於開始已經支援預存程序,這樣即可以大幅提高資料庫的處理速度,同時也能提高資料庫程式設計的彈性。
(1).格式
MySQL預存程序所建立的格式:
CREATE PROCEDURE 流程名([過程參數[,...]]) [特性...] 過程體這裡先舉例:
mysql> DELIMITER // mysql> CREATE PROCEDURE proc1(OUT s int) -> BEGIN -> SELECT COUNT(*) INTO s FROM user; -> END -> // mysql> DELIMITER ;
註:
這裡需要注意的是DELIMITER //和DELIMITER ;兩句,DELIMITER是分割符的意思,因為MySQL預設以";"為分隔符,如果我們沒有宣告分割符,那麼編譯器會把預存程序當成SQL語句處理,則預存程序的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼,不會執行這些代碼,用完了之後要把分隔符還原。
預存程序依需求可能會有輸入、輸出、輸入輸出參數,這裡有一個輸出參數s,型別是int型,如果有多個參數用","分割開。
(2). 宣告分割符
(3). 參數
#########MySQL預存程序的參數用於預存程序的定義,共有三種參數型別,IN,OUT,INOUT,形式如: ############CREATE PROCEDURE([[IN |OUT |INOUT ] 參數名稱資料類別...])###IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数:该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数:调用时指定,并且可被改变和返回
代码示例
header('Content-Type:text/html;charset=UTF-8'); $conn = mysql_connect('localhost','root','123456') or die ("数据连接错误!!!"); mysql_select_db('test',$conn);
实例一:无参的存储过程
$sql = "create procedure myproce() begin INSERT INTO user (id, username, sex) VALUES (NULL, 's', '0'); end; "; $res = mysql_query($sql);//创建一个myproce的存储过程 $sql = "call test.myproce();"; $res = mysql_query($sql);//调用myproce的存储过程,则数据库中将增加一条新记录。 var_dump($res);
实例二:传入参数的存储过程
//$sql = "create procedure myproce2(in score int) //begin //if score >= 60 then //select 'pass'; //else //select 'no'; //end if; //end; //"; //mysql_query($sql);//创建一个myproce2的存储过程 //$sql = "call test.myproce2(90);"; //$reslut = mysql_query($sql);//调用myproce2的存储过程,看不到效果,可以在cmd下看到结果。 //$array = mysql_fetch_array($reslut); //var_dump($array);
以上是mysql預存程序是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!