MySQL學習-存儲過程(二)-創建存儲過程

語言: CN / TW / HK

theme: healer-readable

攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第12天,點擊查看活動詳情

前言

上篇我們學習了一部分MySQL中的存儲過程。有興趣的小夥伴可以閲讀(# MySQL學習-存儲過程(一))。
下面繼續學習MySQL中的存儲過程。

上節,只學習到了存儲過程的語法,下面對語法進行以下説明:

存儲過程語法

CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數名 參數類型,...) [characteristics ...] BEGIN 存儲過程體 END

  1. 參數名前面IN|OUT|INOUT的含義:
    • IN:當前參數為輸入參數,也就是表示入參。存儲過程只是讀取這個參數的值。如果沒有定義參數種類,默認就是IN,表示輸入參數。
    • OUT:當前參數為輸出參數,也就是表示出參。執行完成之後,調用這個存儲過程的程序可以讀取這個參數返回的值。
    • INOUT:當前參數既可以為輸入參數,也可以為輸出參數。
  2. 形參類型可以是MySQL數據庫中的任意類型。
  3. characteristics表示創建存儲過程時指定的對存儲過程的約束條件,其取值信息如下:

LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'

  • LANGUAGE SQL:説明存儲過程執行體是由SQL語句組成的,當前系統支持的語言為SQL。
  • [NOT] DETERMINISTIC:指明存儲過程執行的結果是否確定。DETERMINISTIC表示結果是確定的。每次執行存儲過程時,相同的輸入會得到相同的輸出。[NOT] DETERMINISTIC表示結果是不確定的,相同的輸入可能得到不同的輸出。如果沒有指定任意一個值,默認為[NOT] DETERMINISTIC。
  • { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL語句的限制。
    • CONTAINS SQL:表示當前存儲過程的子程序包含SQL語句,但是並不包含讀寫數據SQL語句。
    • NO SQL:表示當前存儲過程的子程序中不包含任何SQL語句。
    • READS SQL DATA:表示當前存儲過程的子程序中包含讀數據的SQL語句。
    • MODIFIES SQL DATA:表示當前存儲過程的子程序中包含寫數據的SQL語句。
    • 默認,系統會指定為CONTAINS SQL。
  • SQL SECURITY { DEFINER | INVOKER }:執行當前存儲過程的權限,即指明哪些用户能夠執行當前存儲過程。
    • DEFINER:表示只有當前存儲過程的創建者或者定義者才能執行當前存儲過程。
    • INVOKER:表示擁有當前存儲過程的訪問權限的用户能夠執行當前存儲過程。
    • 如果沒有設置相關的值,則MySQL默認指定值為DEFINER。
  • COMMENT 'string':註釋信息,可以用來描述存儲過程。

  • 存儲過程中可以有多條SQL語句,如果僅僅有一條SQL語句,則可以省略BEGIN和END。編寫過程中可能需要複雜的SQL語句。

    • BEGIN...END:BEGIN...END中間包含了多個語句,每個語句都以(;)號為結束符。
    • DECLARE:DECLARE用來聲明變量,使用的位置在於BEGIN...END語句中間,而且需要在其他語句使用之前進行變量的聲明。
    • SET:賦值語句,用於對變量進行賦值。
    • SELECT...INTO:把從數據表中查詢的結果存放到變量中,也就是為變量賦值。
  • 需要設置新的結束標記。

DELIMITER 新的結束標記

  • MySQL的默認語句結束符是分號(;)。為了避免與存儲過程中SQL語句結束符相沖突,需要使用DELIMITER改變存儲過程的結束符。比如:“DELIMITER //”語句的作用是將MySQL的結束符設置為//,並以“END //”結束存儲過程。存儲過程定義完畢之後在使用“DELIMITER ;”恢復默認結束符。
  • 當使用DELIMITER命令時,避免使用“\”字符,因為反斜線是MySQL的轉義字符。

DELIMITER // CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數名 參數類型,...) [characteristics ...] BEGIN 存儲過程體 END //

今天先學習到這裏,明天繼續。