存儲過程是一組為了完成某特定功能的SQL語句集,其實質上就是一段存放在數據庫中的代碼。他可以由聲明式的SQL語句(如CREATE, UPDATE 和SELECT等語句)和過程式(如IF-THEN-ELSE等)組成。 優點: 1. 可增強SQL語言的功能和靈活性。 2. 具有良好的封裝性 3. 高性能 4. 可減少網絡流量 5. 存儲過程可作為一種安全機制來確保數據可的安全性和數據的完整性。
CREATE PROCEDURE sp_name ([proc_parameter[, …]]) [characteristic…] routine_body 說明如下: Sp_name: 存儲過程的名稱,默認在房錢數據庫中創建。需要在特定數據庫中創建存儲過程時,則要在名稱前面加上數據庫的名稱 比如:db_name.sp_name; Proc_parameter: 存儲過程中的參數列表。其中包括三項:[IN|OUT|INOUT] param_name type. 存儲過程支持三種參數,輸入參數,輸出參數,以及輸入輸出參數。對應IN OUT INOUT。 輸入參數可以使數據傳遞給一個存儲過程。輸出參數用于存儲過程需要返回一個操作結果的情形。而輸入輸出參數具有上述兩種的特性。下面兩項是參數名稱和參數類型 Characteristic: 存儲過程中的某些特征設定 ,下面分別介紹 1.COMMENT ‘string’: 用于對于存儲過程的描述,其中string為描述內容,COMMENT為關鍵字。此信息可以通過SHOW CREATE PROCEDURE語句顯示 2.LANGUAGE SQL: 指明編寫此過程的語言為SQL語言,目前而言,MySQL存儲過程還無法用外部編程語言來編寫,也就是說,這個選項可以不選定。今后MYSQL會對其進行擴展。 3.DETERMINISTIC: 如若設置此參數,則對于同樣的輸入參數會產生相同的結果。 若設置為NOT DETERMINITIC ,則會產生不確定的結果。默認為后者。 4.CONTAINS SQL | NO SQL | READS SQL DATA |MODIFIES SQL DATA: CONTAINS SQL代表存儲過程含讀或寫的數據。 NO SQL 表示存儲過程不包含SQL ,語句, 下面兩項分別是只含讀或者只含寫。 5.SQL SECURITY: 這個特征用來指定存儲過程使用創建該存儲過程的用戶的許可來執行還是使用調用者的許可來執行。默認使用用戶。
Routine_body:存儲過程的主體部分 其包含了該存儲過程中需要執行的SQL語句,以關鍵字BEGIN開始,以END 結束。這對關鍵字還可以嵌套使用。

1. 聲明局部變量 a) 語法: DECLARE var_name [,…] type [DEFAULT value] b) Var_name: 用于指定局部變量的名稱 c) Type: 用于聲明局部變量的數據類型 d) DEFAULT子句用于為局部變量指定一個默認值,默認為空(NULL) e) 使用說明: i. 局部變量只能在存儲過程體內的BEGIN ..END 語句塊中聲明 ii. 局部變量必須在存儲過程體的開頭處聲明 iii. 其作用范圍僅限于聲明它的BEGIN …END語句塊中,其他塊中不可使用 iv. 局部變量與用戶變量不同。聲明用戶變量時需前加@。 2. SET 語句 使用SET 語句為局部變量賦值。 SET var_name = expr 3. SELECT … INTO 語句 a) 語法:SELECT col_name […] INTO var_name[…] table_expr b) Col_name:用于指定列名 c) Var_name;用于指定要賦值的變量 d) Table_expr: 表示SELECT 語句中FROM子句及其后面的語法部分 e) 說明:該語句返回的結果集只能有一行 4. 流程控制語句 a) 條件判斷語句 i. 語法:IF serach_condition THEN statement_list [ELSEIF search_condition THEN statement_list]… [ELSE statement_list] END IF ii. Serach_condition:用于指定判斷條件 iii. Statement_list:用于包含一句或多句SQL語句 iv. 只有當判斷條件為真時,才會執行相應的SQL語句 v. 該流程控制語句不同于系統內置函數IF() b) 選擇CASE語句 i. 語法:CASE case_value WHEN When_value THEN statement_list ELSE statement_list END CASE ii. 第二種語法: CASE WHEN search_condition THEN statement_list ….. ELSE statement_list END CASE iii. 第二種語法較為常用,并且使用起來更加方便 c) 循環語句 i. WHILE語句 ii. REPEAT語句 iii. LOOP語句 iv. 退出 1. LEAVE 結束整個循環 2. ITERATE 退出當前循環 v. 游標問題 1. 在上述文章中提到SELECT INTO語句,其結果返回的是帶有值的一行數據,然而在使用SELECT 語句進行檢索數據時,若該語句被成功執行,則會返回一組成為結果集的數據行,其可能擁有多行數據,這些數據無法被一行一行的處理,此時需用到游標。簡而言之,游標就是一個被SELECT語句檢索出來的結果集,在存儲游標之后,就可以根據需要滾動或瀏覽器中的數據。 2. 注意: a) MYSQL中對游標的支持實在5.0版本開始的,之前的MYSQL版本無法使用游標。 b) 游標只能用在存儲過程或者存儲函數中,不能單獨在查詢操作中使用 c) 可定義多個游標,但其名稱必須唯一 d) 其不是一條SELECT語句,而是SELECT檢索出來的結果集 3. 聲明游標 a) DECLARE cursor_name CURSOR FOR select_statement b) Cursor_name: 游標的名稱 c) Select_statement: 指定一個SELECT 語句,返回一行或多行結果,不可含有INTO子句 4. 打開游標 a) 在定義游標之后,必須打開游標才能使用,這個過程實際上就是將游標連接到SELECT語句返回的結果集中 b) 語法格式:OPEN cursor_name c) 一個游標可被多次打開,由于其他用戶或者應用程序可能隨時更新了數據表,因此每次打開游標的結果集可能會不同 5. 讀取數據 a) 對填有數據的游標,可根據需要取出數據。 b) 語法結構:FETCH cursor_name INTO var_name[,…] c) Cursor_name: 用于指定已打開的游標 d) Var_name: 用于指定存放數據的變量名 6. 關閉游標 a) 結束游標使用時,必須將其關閉 b) CLOSE cursor_name c) 每個游標不再使用時,都需要將其關閉,使用CLOSE語句將會釋放游標所使用的全部資源。關閉后,如果沒有再次重新打開,則該游標不能被重新使用,對于聲明過的游標,則不需要再次聲明,可直接使用OPEN打開, 另外,如果忘記關閉游標,MYSQL在到達END語句時會自動關閉。
新聞熱點
疑難解答