一.什么事存儲過程?
存儲例程是存儲在數(shù)據(jù)庫服務器中的一組sql語句,通過在查詢中調(diào)用一個指定的名稱來執(zhí)行這些sql語句命令
二.為什么要用存儲過程?
1.程序分兩種,一種是基于web论巍,一種是基于桌面诗越,他們都和數(shù)據(jù)庫進行交互來完成數(shù)據(jù)的存取工作。假設現(xiàn)在有一種應用程序包含了這兩種谤草,
現(xiàn)在要修改其中的一個查詢sql語句,那么我們可能要同時修改他們中對應的查詢sql語句,當我們的應用程序很龐大很復雜的時候問題就出現(xiàn)這咙鞍,
不易維護箫柳!另外把sql查詢語句放在我們的web程序或桌面中很容易遭到sql注入的破壞镀脂。而存儲例程正好可以幫我們解決這些問題。
存儲過程(stored procedure)酒觅、存儲例程(store routine)撮执、存儲函數(shù)區(qū)別
Mysql存儲例程實際包含了存儲過程和存儲函數(shù),它們被統(tǒng)稱為存儲例程舷丹。
其中存儲過程主要完成在獲取記錄或插入記錄或更新記錄或刪除記錄抒钱,即完成select insert delete update等的工作。
而存儲函數(shù)只完成查詢的工作颜凯,可接受輸入?yún)?shù)并返回一個結(jié)果谋币。
2.存儲過程能不用盡量不用,原則是:業(yè)務邏輯不要封裝在數(shù)據(jù)庫里面(數(shù)據(jù)庫去進行邏輯判斷業(yè)務)。
把業(yè)務邏輯要交給應用程序處理装获。這樣可以減少數(shù)據(jù)庫資源消耗瑞信。人員也難以招聘,因為既懂存儲過程穴豫,
又懂業(yè)務的人少。使用困難逼友。大量業(yè)務邏輯封裝在存儲過程中精肃,造成后面根本就不能動了。動a影響b帜乞。
以后業(yè)務邏輯很難剝離出來司抱。增加以后維護困難。
三,創(chuàng)建存儲函數(shù);
1.格式;
create procedure 存儲過程名(參數(shù))
存儲過程體
create function 存儲函數(shù)名(參數(shù))
2.如;
mysql> DELIMITER //
ysql> CREATE PROCEDURE proc1(OUT s int)
-> BEGIN
-> SELECT COUNT(*) INTO s FROM user;
-> END
-> //
mysql> DELIMITER ;
3.注意;
(1)這里需要注意的是DELIMITER//和DELIMITER;兩句黎烈,DELIMITER是分割符的意思习柠,因為MySQL默認以”;”為分隔 符,
如果我們沒有聲明分割符照棋,那么編譯器會把存儲過程當成SQL語句進行處理资溃,則存儲過程的編譯過程會報錯,
所以要事先用DELIMITER關鍵字申明當 前段分隔符烈炭,這樣MySQL才會將”;”當做存儲過程中的代碼溶锭,不會執(zhí)行這些代碼,
用完了之后要把分隔符還原符隙。
(2)存儲過程根據(jù)需要可能會有輸入趴捅、輸出、輸入輸出參數(shù)霹疫,這里有一個輸出參數(shù)s拱绑,類型是int型,如果有多個參數(shù)用”,”分割開丽蝎。
(3)過程體的開始與結(jié)束使用BEGIN與END進行標識猎拨。
這樣,我們的一個MySQL存儲過程就完成了,是不是很容易呢?看不懂也沒關系迟几,接下來消请,我們詳細的講解。
四:參數(shù)
1.MySQL存儲過程的參數(shù)用在存儲過程的定義类腮,共有三種參數(shù)類型,IN,OUT,INOUT,形式如:
CREATEPROCEDURE 存儲過程名([[IN |OUT |INOUT ] 參數(shù)名 數(shù)據(jù)類形…])
IN 輸入?yún)?shù):表示該參數(shù)的值必須在調(diào)用存儲過程時指定臊泰,在存儲過程中修改該參數(shù)的值不能被返回,為默認值
OUT 輸出參數(shù):該值可在存儲過程內(nèi)部被改變蚜枢,并可返回
INOUT 輸入輸出參數(shù):調(diào)用時指定缸逃,并且可被改變和返回
例如:
.IN參數(shù)例子