MySQL 儲存過程的基本用法
mysql儲存過程詳解
1. 儲存過程簡介
我們常用的操作資料庫語言SQL語句在執行的時候需要要先編譯,然後執行,而儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數(如果該儲存過程帶有引數)來呼叫執行它。
一個儲存過程是一個可程式設計的函式,它在資料庫中建立並儲存。它可以有SQL語句和一些特殊的控制結構組成。當希望在不同的應用程式或平臺上執行相同的函式,或者封裝特定功能時,儲存過程是非常有用的。資料庫中的儲存過程可以看做是對程式設計中面向物件方法的模擬。它允許控制資料的訪問方式。
儲存過程通常有以下優點:
(1).儲存過程增強了SQL語言的功能和靈活性。儲存過程可以用流控制語句編寫,有很強的靈活性,可以完成複雜的判斷和較複雜的運算。
(2).儲存過程允許標準組件是程式設計。儲存過程被建立後,可以在程式中被多次呼叫,而不必重新編寫該儲存過程的SQL語句。而且資料庫專業人員可以隨時對儲存過程進行修改,對應用程式原始碼毫無影響。
(3).儲存過程能實現較快的執行速度。如果某一操作包含大量的Transaction-SQL程式碼或分別被多次執行,那麼儲存過程要比批處理的執行速度快很多。因為儲存過程是預編譯的。在首次執行一個儲存過程時查詢,優化器對其進行分析優化,並且給出最終被儲存在系統表中的執行計劃。而批處理的
(4).儲存過程能過減少網路流量。針對同一個資料庫物件的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織程儲存過程,那麼當在客戶計算機上呼叫該儲存過程時,網路中傳送的只是該呼叫語句,從而大大增加了網路流量並降低了網路負載。
(5).儲存過程可被作為一種安全機制來充分利用。系統管理員通過執行某一儲存過程的許可權進行限制,能夠實現對相應的資料的訪問許可權的限制,避免了非授權使用者對資料的訪問,保證了資料的安全。
2. 關於MySQL的儲存過程
儲存過程是資料庫儲存的一個重要的功能,但是
3. MySQL儲存過程的建立
(1). 格式
MySQL儲存過程建立的格式:CREATE
PROCEDURE 過程名 ([過程引數[,...]])
[特性 ...] 過程體
這裡先舉個例子:
-
mysql>
DELIMITER // -
mysql> CREATEPROCEDURE
proc1( OUTs int) -
-> -
-> s FROMuser; -
-> -
-> // -
mysql>
DELIMITER ;
(1)這裡需要注意的是DELIMITER //和DELIMITER ;兩句,DELIMITER是分割符的意思,因為MySQL預設以";"為分隔符,如果我們沒有宣告分割符,那麼編譯器會把儲存過程當成SQL語句進行處理,則儲存過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做儲存過程中的程式碼,不會執行這些程式碼,用完了之後要把分隔符還原。
(2)儲存過程根據需要可能會有輸入、輸出、輸入輸出引數,這裡有一個輸出引數s,型別是int型,如果有多個引數用","分割開。
(3)過程體的開始與結束使用BEGIN與END進行標識。
這樣,我們的一個MySQL儲存過程就完成了,是不是很容易呢?看不懂也沒關係,接下來,我們詳細的講解。
(2). 宣告分割符
其實,關於宣告分割符,上面的註解已經寫得很清楚,不需要多說,只是稍微要注意一點的是:如果是用MySQL的Administrator管理工具時,可以直接建立,不再需要宣告。
(3). 引數
MySQL儲存過程的引數用在儲存過程的定義,共有三種引數型別,IN,OUT,INOUT,形式如:
CREATE PROCEDURE([[IN |OUT |INOUT ] 引數名 資料類形...])
IN 輸入引數:表示該引數的值必須在呼叫儲存過程時指定,在儲存過程中修改該引數的值不能被返回,為預設值
OUT 輸出引數:該值可在儲存過程內部被改變,並可返回
INOUT 輸入輸出引數:呼叫時指定,並且可被改變和返回
Ⅰ. IN引數例子
建立:
-
mysql
> DELIMITER // -
mysql
> CREATEPROCEDUREdemo_in_parameter( INp_in int) - -> BEGIN
-
-> SELECT
p_in; -
-> SET
p_in=2; -
-> SELECT
p_in; - -> END;
-
->
// -
mysql
> DELIMITER ;
執行結果:
-
mysql
> SET@p_in=1; -
mysql
> CALL demo_in_parameter(@p_in); - +------+
-
|
p_in | - +------+
-
|
1 | - +------+
- +------+
-
|
p_in | - +------+
-
|
2 | - +------+
-
mysql> SELECT
@p_in; - +-------+
-
|
@p_in | - +-------+
-
|
1 | - +-------+
以上可以看出,p_in雖然在儲存過程中被修改,但並不影響@p_id的值
Ⅱ.OUT引數例子
建立:
-
mysql
> DELIMITER // -
mysql
> CREATEPROCEDUREdemo_out_parameter( OUTp_out int) - -> BEGIN
-
-> SELECT
p_out; -
-> SET
p_out=2; -
-> SELECT
p_out; - -> END;
-
->
// -
mysql
> DELIMITER ;
執行結果:
-
mysql
> SET@p_out=1; -
mysql
> CALL sp_demo_out_parameter(@p_out); - +-------+
-
|
p_out | - +-------+
-
| NULL
| - +-------+
- +-------+
-
|
p_out | - +-------+
-
|
2 | - +-------+
-
mysql> SELECT
@p_out; - +-------+
-
|
p_out | - +-------+
-
|
2 | - +-------+
Ⅲ. INOUT引數例子
建立:
-
mysql
> DELIMITER // -
mysql
> CREATEPROCEDUREdemo_inout_parameter(INOUT int)p_inout - -> BEGIN
-
-> SELECT
p_inout; -
-> SET
p_inout=2; -
-> SELECT
p_inout; - -> END;
-
->
// -
mysql
> DELIMITER ;
-
mysql >
SET p_inout=1;@ -
mysql >
CALL demo_inout_parameter(@p_inout) ; - +---------+
-
|
p_inout | - +---------+
-
|
1 | - +---------+
- +---------+
-
|
p_inout | - +---------+
-
|
2 | - +---------+
-
mysql >
SELECT @p_inout; - +----------+
-
|
@p_inout | - +----------+
-
|
2 | - +----------+
(4). 變數
Ⅰ. 變數定義
DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
其中,datatype為MySQL的資料型別,如:int, float, date, varchar(length)
例如:
-
DECLARE
l_int intunsigned default4000000; -
DECLARE
l_numeric DEFAULTnumber(8,2) 9.95; -
DECLARE
l_date dateDEFAULT'1999-12-31'; -
DECLARE
l_datetime dat