国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

數據庫存儲過程與存儲函數相關(MYSQL)

2024-07-24 13:00:18
字體:
來源:轉載
供稿:網友

一. 概述

存儲過程是一組為了完成某特定功能的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 結束。這對關鍵字還可以嵌套使用。

三. 修改結束修飾標志

在服務器處理SQL語句的過程中,因為默認使用;結束,所以在創建存儲過程中時,他一定會包含有多條的SQL語句,而如果仍以;結束的話,那么第一條SQL語句的;會作為整個程序的結束符。所以,使用DELIMITER 符號作為臨時的結束修飾符如: DELIMITER $$;

四.存儲過程體

在存儲過程主體內,可以使用各種SQL語句,也可以使用過程式語句,用來封裝數據庫中復雜的業務邏輯和處理規則,以實現數據庫應用的靈活編程。

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語句時會自動關閉。

五. 調用存儲過程

1. 創建好存儲過程后,可直接使用CALL 語句調用。2. CALL sp_name([parameter]) i. sp_name: 指定被調用的存儲過程的名稱。ii. parameter: 指定存儲過程中所要使用的參數,調用語句中的參數個數必須等于存儲過程中的參數個數。iii. 當調用沒有參數時,直接使用CALL sp_name即可

六. 刪除存儲過程

1. DROP PROCEDURE FUNCTION [IF EXISTS] sp_name2. sp_name: 指定要刪除的存儲過程中的名稱,其身后沒有參數列表,也沒有括號。

七. 存儲函數與存儲過程十分相似

1. 存儲函數不能擁有輸出函數,這是因為存儲函數自身就是輸出參數,而存儲過程可以有輸出參數2. 可以直接對存儲函數進行調用,且不需要使用CALL語句,而對于存儲過程的調用,需要CALL3. 存儲函數需包含一條RETURN語句,而這條語句不被允許在存儲過程中出現。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 溧水县| 和静县| 犍为县| 车致| 多伦县| 大渡口区| 纳雍县| 东平县| 松潘县| 锦州市| 吴川市| 吴江市| 祁门县| 清远市| 嘉禾县| 永兴县| 调兵山市| 河源市| 阆中市| 西丰县| 南皮县| 金门县| 历史| 五指山市| 满城县| 灵山县| 黔江区| 个旧市| 刚察县| 澎湖县| 广东省| 钦州市| 清流县| 新巴尔虎左旗| 息烽县| 镇江市| 四川省| 卓资县| 洛宁县| 广饶县| 兴安县|