MYSQL的儲存過程和遊標的使用
阿新 • • 發佈:2018-12-05
1、儲存過程
儲存過程是什麼,簡單來講,就像Java中的 方法(函式),不過它是SQL世界中的方法。大部分時候,我們所使用都是單條SQL,用來針對一個或多表連線。但是也有情況,是據判斷先對錶A執行操作,變動後再結合表B進行操作。即SQL的執行可能需要 考慮包含業務規則在內的智慧處理。封裝操作的好處就不過多說明,無非是簡化,複用,降低耦合等,同時,它還具有更高的效能。
考慮這種業務情況,現在你需要獲得訂單總額,但同時需要增加營業稅,且只針對某些顧客,那麼你需要:
- 獲得基本的訂單總額
- 將營業稅有條件地新增到合計中
- 返回合計
1.1 基本語句
先看基本的語句,然後再看示例,就豁然開朗了:--建立儲存過程
CREATE PROCEDURE <儲存過程的名稱>(<變數的型別定義>)
BEGIN
<執行操作>
END;
--執行儲存過程
CALL <儲存過程的名稱>(<@變數名>);
--刪除儲存過程
DROP PROCEDURE <儲存過程的名稱>;
1.2 建立
-- Name: ordertotal
-- Parameters: onumber = order number
-- taxable = 0 if not taxable, 1 if taxable
-- ototal = order total variable
CREATE PROCEDURE ordertotal(
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL
) COMMENT 'Obtain order total, optionally adding tax'
BEGIN
--Declare variable for total
DECLARE total DECIMAL(8, 2);
--Declare tax percentage
DECLARE taxrate INT DEFAULT 6;
--GET the order total
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO total;
--Is this taxable
IF taxable THEN
SELECT total+(total/100*taxrate) INTO total;
END IF;
SELECT total INTO ototal;
- END;
看起來這麼長好像挺唬人,其實很清楚:
CREATE PROCEDURE ordertotal(
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8, 2)
) COMMENT 'Obtain order total, optionally adding tax'
- 使用CREATE PROCEDURE關鍵詞建立了名為ordertotal的儲存過程
- 該儲存過程定義了三個變數,IN表示要求輸入的引數,OUT表示輸出的結果。INT、BOOLEAN等表示變數的資料型別
- COMMENT非必需,如果有,那麼在SHOW PROCEDURE STATUS的結果時會顯示(簡單說,類似於方法的說明)
BEGIN
...
END;
- BEGIN和END用來界定儲存過程操作執行的語句
--Declare variable for total
DECLARE total DECIMAL(8, 2);
--Declare tax percentage
DECLARE taxrate INT DEFAULT 6;
--GET the order total
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO total;
- DECLARE用來定義儲存過程中的區域性變數
- INTO表示賦值到變數
--Is this taxable
IF taxable THEN
SELECT total+(total/100*taxrate) INTO total;
END IF;
- IF <boolean> THEN <do something> END IF 為條件執行語句,記得END IF結尾
假如用Java來寫的話,大概是這麼個意思:
public void ordertotal(int onumber, boolean taxable, double ototal) {
double total;
int taxrate = 6;
total = getOrderTotal(onumber);
if (taxable) {
total += total / (100 * taxrate);
}
ototal = total;
}
1.3 執行
在1.2我們定義了儲存過程ordertotal(),則執行方式為:--不含營業稅
CALL ordertotal(20005, 0, @total);
SELECT @total
+----------+
| @total |
+----------+
| 149.87 |
+----------+
--包含營業稅
CALL ordertotal(20005, 1, @total);
SELECT @total
+-----------------+
| @total |
+-----------------+
| 158.862200000 |
+-----------------+
定義時我們說過,IN表示定義輸入,OUT表示定義輸出,所以這裡的三個變數中,前兩者由呼叫者傳入,而第三個變數,則作為返回結果的變數。 ( 呼叫儲存過程時,用於臨時儲存返回資料的變數必須以@開頭)
1.4 檢查
用來顯示“建立某個儲存過程的CREATE語句”,使用SHOW CREATE PROCEDURE語句:SHOW CREATE PROCEDURE ordertotal;
1.5 刪除
DROP PROCEDURE ordertotal;
2、遊標
在檢索出來的行中,前進或者後退一行或多行,就需要用到所謂的“遊標”。遊標不是某個SELECT語句,但是它是被該 語句檢索出來的結果集,另外, MySQL遊標只能用於儲存過程(和函式)。2.1 建立遊標
使用 DECLARE和 CURSOR關鍵字:CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
END;
2.2 開啟和關閉遊標
因為遊標侷限於儲存過程,所以如果儲存過程處理完成後,遊標就會消失。所以往往在儲存過程中要關鍵字 OPEN進行開啟。另,遊標相關的SELECT查詢語句,在定義時是不執行的,在OPEN時才執行查詢,儲存檢索出的資料以供瀏覽和滾動。在遊標使用完成後,使用 CLOSE進行關閉:CREATE PROCEDURE processorders()
BEGIN
--Declare
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
--Open
OPEN ordernumbers;
--Close
CLOSE ordernumbers;
END;