mysql高階進階(儲存過程、遊標、觸發器)
阿新 • • 發佈:2021-11-10
廢話不多說,直接進入正題...
一、儲存過程
a、概述
- 儲存過程可以看成是對一系列 SQL 操作的批處理;
- 使用儲存過程的好處
- 程式碼封裝,保證了一定的安全性;
- 程式碼複用;
- 由於是預先編譯,因此具有很高的效能。
- 建立儲存過程
- 命令列中建立儲存過程需要自定義分隔符,因為命令列是以;為結束符,而儲存過程中也包含了分號,因此會錯誤把這部分分號當成是結束符,造成語法錯誤。
- 包含 in、out 和 inout 三種引數。
- 給變數賦值都需要用 select into 語句。
- 每次只能給一個變數賦值,不支援集合的操作。
b、建立儲存過程
- DROP PROCEDURE IF EXISTS `proc_adder`;
- DELIMITER ;;
- CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int)
- BEGIN
- DECLARE c int;
- if a is null then set a = 0;
- end if;
- if b is null then set b = 0;
- end if;
- set sum = a + b;
- END
- ;;
- DELIMITER ;
c、使用儲存過程
- set@b=5;
- call proc_adder(2,@b,@s);
- select@sas sum;
二、遊標
a、概述
- 遊標(cursor)是一個儲存在 DBMS 伺服器上的資料庫查詢,它不是一條 SELECT 語句,而是被該語句檢索出來的結果集。
- 在儲存過程中使用遊標可以對一個結果集進行移動遍歷。
- 遊標主要用於互動式應用,其中使用者需要對資料集中的任意行進行瀏覽和修改。
- 使用遊標的四個步驟:
- 宣告遊標,這個過程沒有實際檢索出資料;
- 開啟遊標;
- 取出資料;
- 關閉遊標;
SQL語句示例:
- DELIMITER $
- CREATE PROCEDURE getTotal()
- BEGIN
- DECLARE total INT;
- -- 建立接收遊標資料的變數
- DECLARE sid INT;
- DECLARE sname VARCHAR(10);
- -- 建立總數變數
- DECLARE sage INT;
- -- 建立結束標誌變數
- DECLARE done INT DEFAULT false;
- -- 建立遊標
- DECLARE cur CURSOR FOR SELECT id,name,age from cursor_table where age>30;
- -- 指定遊標迴圈結束時的返回值
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
- SET total = 0;
- OPEN cur;
- FETCH cur INTO sid, sname, sage;
- WHILE(NOT done)
- DO
- SET total = total + 1;
- FETCH cur INTO sid, sname, sage;
- END WHILE;
- CLOSE cur;
- SELECT total;END $DELIMITER ;
- -- 呼叫儲存過程
- call getTotal();
三、觸發器
a、概述
- 觸發器是一種與表操作有關的資料庫物件,當觸發器所在表上出現指定事件時,將呼叫該物件,即表的操作事件觸發表上的觸發器的執行
可以使用觸發器來進行審計跟蹤,把修改記錄到另外一張表中。
MySQL 不允許在觸發器中使用 CALL 語句 ,也就是不能呼叫儲存過程。
- BEGIN 和 END
- 當觸發器的觸發條件滿足時,將會執行BEGIN和END之間的觸發器執行動作。
- 注意:
- 在 MySQL 中,分號 ; 是語句結束的識別符號,遇到分號表示該段語句已經結束,MySQL 可以開始執行了。因此,直譯器遇到觸發器執行動作中的分號後就開始執行,然後會報錯,因為沒有找到和 BEGIN 匹配的 END。
- 這時就會用到DELIMITER命令(DELIMITER 是定界符,分隔符的意思)。它是一條命令,不需要語句結束標識,語法為:DELIMITER new_delemiter。new_delemiter可以設為 1 個或多個長度的符號,預設的是分號;,我們可以把它修改為其他符號,如$-DELIMITER $。在這之後的語句,以分號結束,直譯器不會有什麼反應,只有遇到了$,才認為是語句結束。注意,使用完之後,我們還應該記得把它給修改回來。
- NEW 和 OLD
- MySQL 中定義了NEW和OLD關鍵字,用來表示觸發器的所在表中,觸發了觸發器的那一行資料。
- 在INSERT型觸發器中,NEW用來表示將要(BEFORE)或已經(AFTER)插入的新資料;
- 在UPDATE型觸發器中,OLD用來表示將要或已經被修改的原資料,NEW用來表示將要或已經修改為的新資料;
- 在DELETE型觸發器中,OLD用來表示將要或已經被刪除的原資料;
- 使用方法:NEW.columnName(columnName 為相應資料表某一列名)
b、建立觸發器
提示:為了理解觸發器的要點,有必要先了解一下建立觸發器的指令。
- CREATE TRIGGER指令用於建立觸發器。
- 語法:
- CREATE TRIGGER trigger_name
- trigger_time
- trigger_event
- ON table_name
- FOR EACH ROW
- BEGIN
- trigger_statements
- END;
- 說明:
- trigger_name:觸發器名
- trigger_time: 觸發器的觸發時機。取值為BEFORE或AFTER。
- trigger_event: 觸發器的監聽事件。取值為INSERT、UPDATE或DELETE。
- table_name: 觸發器的監聽目標。指定在哪張表上建立觸發器。
- FOR EACH ROW: 行級監視,Mysql 固定寫法,其他 DBMS 不同。
- trigger_statements: 觸發器執行動作。是一條或多條 SQL 語句的列表,列表內的每條語句都必須用分號;來結尾。
- 示例:
- DELIM ITER $
- CREATE TRIGGER `trigger_insert_user`
- AFTER INSERT ON `user`
- FOR EACH ROW
- BEGIN
- INSERT INTO `user_history`(user_id, operate_type, operate_time)
- VALUES (NEW.id, 'add a user', now());
- END $
- DELIMITER ;
c、檢視觸發器
SHOW TRIGGERS;
d、刪除觸發器
DROP TRIGGER IF EXISTS trigger_insert_user;
本文來自部落格園,作者:黑bky,轉載請註明原文連結:https://www.cnblogs.com/zcjbky/p/15534061.html