預存程序簡介
SQL語句需要先編譯然後執行,而預存程序(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在在資料庫中,使用者透過指定預存程序的名字並給定參數(如果該預存程序帶有參數)來呼叫執行它。預存程序是可程式設計的函數,在資料庫中建立並儲存,可以由SQL語句和控制結構組成。當想要在不同的應用程式或平台上執行相同的函數,或封裝特定功能時,預存程序是非常有用的。資料庫中的預存程序可以看做是對程式設計中物件導向方法的模擬,它允許控制資料的存取方式。
推薦課程:MySql教學。
預存程序的優點:
(1).增強SQL語言的功能和靈活性:預存程序可以用控制語句編寫,具有很強的彈性,可以完成複雜的判斷和較複雜的運算。
(2).標準元件式程式設計:在儲存程序建立後,可以在程式中被多次調用,而不必重新編寫該預存程序的SQL語句。而且資料庫專業人員可以隨時對預存程序進行修改,對應用程式原始碼毫無影響。
(3).較快的執行速度:如果某一作業包含大量的Transaction-SQL程式碼或分別被多次執行,那麼預存程序要比批次的執行速度快很多。因為預存程序是預編譯的。在首次運行預存程序時查詢,優化器對其進行分析優化,並且給出最終被儲存在系統表中的執行計劃。而批次的Transaction-SQL語句在每次執行時都要進行編譯和最佳化,速度相對要慢一些。
(4).減少網路流量:針對同一個資料庫物件的操作(如查詢、修改),如果此操作所涉及的Transaction-SQL語句被組織進儲存過程,那麼當在客戶計算機上呼叫該預存程序時,網路中傳送的只是該呼叫語句,從而大大減少網路流量並降低了網路負載。
(5).作為一種安全機制來充分利用:透過對執行某一預存程序的權限進行限制,能夠實現對相應的數據的存取權限的限制,避免了非授權用戶對數據的訪問,保證了資料的安全。
MySQL的預存程序
預存程序是資料庫的一個重要的功能,MySQL 5.0以前不支援預存程序,這使得MySQL在應用程式上大打折扣。好在MySQL 5.0開始支援預存程序,這樣即可以大幅提高資料庫的處理速度,同時也可以提高資料庫程式設計的彈性。
MySQL預存程序的建立
語法
CREATE PROCEDURE 过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体 DELIMITER // CREATE PROCEDURE myproc(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM students; END // DELIMITER ;
分隔符號
MySQL預設以";"為分隔符,如果沒有宣告分割符,則編譯器會把預存程序當成SQL語句處理,因此編譯過程會報錯,所以事先用「DELIMITER //」宣告目前段分隔符,請編譯器把兩個"//"之間的內容當作預存程序的程式碼,不會執行這些程式碼;「DELIMITER ;」的意思是把分隔符號還原。
參數
預存程序依需求可能會有輸入、輸出、輸入輸出參數,如果有多個參數以","分割開。 MySQL預存程序的參數用在預存程序的定義,共有三種參數型別,IN,OUT,INOUT:
IN參數的值必須在呼叫預存程序時指定,在預存程序中修改該參數的值不能被傳回,為預設值OUT:該值可在儲存過程內部改變,並可返回INOUT:呼叫時指定,並且可被改變和返回
過程體
過程體的開始與結束使用BEGIN與END進行標識。
總結
本次主要是掌握了對於儲存過程的使用,總的來說,儲存過程實際上類似於C 中的函數,而在C 中我們是需要在創建這一過程的文件中去調用這一函數,但是對於存儲過程來說,相當於是將這一操作過程存儲在數據庫中,可以使用call與對其進行調用,並輸入或輸出一些參數和結果。
印象最深的是類似「in n int」和「out sum int」這樣的對於輸入輸出的定義,透過查看相關博客,可以總結如下對於輸入輸出定義的使用規律:
MySQL預存程序的參數用於預存程序的定義,共有三種參數型別
IN,OUT,INOUT
格式為:Create procedure|function([[IN |OUT |INOUT ] 參數名資料類形...])
IN 輸入參數
表示此參數的值必須在呼叫預存程序時指定,在預存程序中修改此參數的值不能被傳回,為預設值
OUT 輸出參數
此值可在預存程序內部變更,並可傳回
INOUT 輸入輸出參數
呼叫時指定,並且可變更和傳回
IN 和 OUT在實驗中已有體會,主要是對INOUT的理解,這裡引用一個例子:
參數inout的使用實例(既能輸入一個值又能傳出一個值)
語句功能:傳一個年齡,自動讓年齡增長10歲
create procedure p3(inout age int)
begin
set age:=age 10;
end
其中:呼叫的時候,inout型的參數值既是輸入類型又是輸出類型,給它一個值,值不是變量,因此我們需要先設定一個變數並初始化這個值,呼叫的時候直接傳這個變數即可。
set @currentAge=8$
call p3(@currentAge)$
select @currentAge$
建立並執行完預存程序,執行結果如下:
以上是資料庫預存程序怎麼寫的詳細內容。更多資訊請關注PHP中文網其他相關文章!