本文更新于2019-06-23,使用MySQL 5.7,作業系統為Deepin 15.4,
目錄- SQL陳述句
- 創建存盤程序或函式
- 修改存盤程序或函式
- 洗掉存盤程序或函式
- 呼叫存盤程序或函式
- 變數、條件、處理、游標
- 變數
- 條件
- 處理
- 游標
- 流程控制
- IF
- CASE
- LEAVE
- ITERATE
- LOOP
- WHILE
- REPEAT
- 示例
SQL陳述句
創建存盤程序或函式
創建存盤程序:
CREATE PROCEDURE name ({[IN|OUT|INOUT] param type}[, ...])
[characteristic]
body
創建函式:
CREATE FUNCTION name ({param type}[, ...]) RETURNS type
[characteristic]
body
type表示資料型別,
characteristic表示特征值,特征值目前只是提供資訊給服務器,定義如下:
LANGUAGE SQL
|[NOT] DETERMINISTIC
|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY {DEFINER|INVOKER}
|COMMENT 'string'
- LANGUAGE SQL:說明body是使用SQL撰寫的,該值是默認的,
- [NOT] DETERMINISTIC:說明是確定的,即是否同樣的輸入產生同樣的輸出,默認為
NOT DETERMINISTIC, - CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA:目前并沒有根據此特征值約束存盤程序實際對資料的使用,
CONTAINS SQL表示不包含讀寫陳述句;NO SQL表示不包含SQL陳述句;READS SQL DATA表示包含讀陳述句不包含寫陳述句;MODIFIES SQL DATA表示包含寫陳述句,默認為CONTAINS SQL, - SQL SECURITY {DEFINER|INVOKER}:表示使用創建者的權限來執行,還是使用呼叫者的權限來執行,默認為
DEFINER, - COMMENT 'string':注釋,
body由BEGIN和END包起,其中可以定義變數、條件、處理、游標,以及使用流程控制陳述句跳轉邏輯,
存盤程序和函式的CREATE語法不支持OR REPLACE,
存盤程序和函式的區別:函式一定有回傳值,存盤程序一定沒有回傳值;函式的引數只能使用IN型別,存盤程序的引數可使用IN、OUT、INOUT型別,
MySQL的存盤程序和函式中允許包含DDL陳述句,允許執行提交或回滾,允許呼叫其他存盤程序或函式,但是是不允許執行LOAD DATA INFILE陳述句,
通常在執行創建存盤程序或函式前,使用DELIMITER ;;命令將陳述句的結束符從;修改成其他符號(示例使用;;),在創建完畢后,通過DELIMITER ;命令將結束符還原,這樣可避免存盤程序定義中的;被錯誤決議為結束符,
修改存盤程序或函式
ALTER PROCEDURE|FUNCTION name
[characteristic]
characteristic特征值如下:
{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY {DEFINER|INVOKER}
|COMMENT 'string'
洗掉存盤程序或函式
DROP PROCEDURE|FUNCTION [IF EXISTS] name
一次只能洗掉一個存盤程序或函式,
呼叫存盤程序或函式
CALL name(param[, ...])
如果是輸出引數,需傳入變數,如:@xxx,
變數、條件、處理、游標
變數、條件、處理、游標都通過DECLARE定義,但它們之間是有先后順序的:變數和條件必須在最前面宣告,然后才是游標的宣告,最后才是處理的宣告,
變數
變數不區分大小寫,作用范圍只能在BEGIN ... END塊中,可以用在嵌套的塊中,變數的定義必須寫在復合陳述句的開頭,并且在其他陳述句的前面,
DECLARE var[, ...] type [DEFAULT value]
變數直接賦值:
SET {var = value}[, ...]
變數通過查詢賦值,這要求查詢回傳的結果只有一行:
SELECT colname[, ...] INTO var[, ...] FROM ...
FROM后面的子句同普通的SELECT查詢,在此省略,
條件
DECLARE condition_name CONDITION FOR
{SQLSTATE [VALUE] value}|mysql_error_code
條件枚的含義如下:
SQLSTATE [VALUE] value:SQLSTATE代碼,為一個字串,mysql_error_code:mysql_error_code值,為一個整數,
處理
DECLARE CONTINUE|EXIT|UNDO HANDLER FOR
{SQLSTATE [VALUE] value|condition_name|SQLWARNING|NOT FOUND|SQLEXCEPTION|mysql_error_code}[, ...]
sp_statement
處理型別列舉值的含義:
CONTINUE:繼續執行后面的陳述句,EXIT:執行終止,UNDO:前面已執行的陳述句撤銷,目前還不支持,
條件枚的含義如下:
SQLSTATE [VALUE] value:SQLSTATE代碼,為一個字串,condition_name:DECLARE定義的CONDITION名,SQLWARNING:所有以01開頭的SQLSTATE代碼的速記,NOT FOUND:所有以02開頭的SQLSTATE代碼的速記,SQLEXCEPTION:所有沒有被SQLWARNING和NOT FOUND捕獲的SQLSTATE代碼的速記,mysql_error_code:mysql_error_code值,為一個整數,
游標
宣告游標:
DECLARE cursor_name CURSOR FOR select_statement
打開游標:
OPEN cursor_name
讀取游標:
FETCH cursor_name INTO var[, ...]
關閉游標:
CLOSE cursor_name
流程控制
IF
IF condition1 THEN statement_list1
[ELSEIF condition2 THEN statement_list2]
[...]
[ELSE statement_list3]
END IF
CASE
CASE case_value
WHEN value1 THEN statement_list1
[...]
[ELSE statement_list2]
END CASE
或:
CASE
WHEN condition1 THEN statement_list1
[...]
[ELSE statement_list2]
END CASE
LEAVE
從標注的流程中退出,通常和BEGIN ... END或回圈一起使用,
LEAVE label
ITERATE
ITERATE必須用在回圈中,作用是跳過當前回圈的剩下陳述句,進入下一輪回圈,
ITERATE label
LOOP
通常需在statement_list中指定退出條件,否則為死回圈,
[begin_label:] LOOP
statement_list
END LOOP [end_label]
WHILE
當滿足條件時執行回圈,會在首次回圈執行前判斷條件,故回圈最少執行0次,
[begin_label:] WHILE condition DO
statement_list
END WHILE [end_label]
REPEAT
當滿足條件時退出回圈,會在首次回圈執行后判斷條件,故回圈最少執行1次,
[begin_label:] REPEAT
statement_list
UNTIL condition
END REPEAT [end_label]
示例
存盤程序定義示例如下:
DELIMITER ;;
CREATE PROCEDURE sp_test(IN id INT, OUT sum INT)
BEGIN
DECLARE var_value, var_sum INT DEFAULT 0;
DECLARE flag INT DEFAULT 1;
DECLARE cur CURSOR FOR SELECT value FROM t WHERE tid = id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 0;
OPEN cur;
loop_cur: LOOP
FETCH cur INTO var_value;
IF flag = 0 THEN
LEAVE loop_cur;
END IF;
var_sum = var_sum + var_value;
END LOOP;
CLOSE cur;
END;;
DELIMITER ;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/16387.html
標籤:MySQL
