1. 程式人生 > 其它 >mysql高階進階(儲存過程、遊標、觸發器)

mysql高階進階(儲存過程、遊標、觸發器)

廢話不多說,直接進入正題...

一、儲存過程

a、概述

  • 儲存過程可以看成是對一系列 SQL 操作的批處理;
  • 使用儲存過程的好處
    1. 程式碼封裝,保證了一定的安全性;
    2. 程式碼複用;
    3. 由於是預先編譯,因此具有很高的效能。
  • 建立儲存過程
    1. 命令列中建立儲存過程需要自定義分隔符,因為命令列是以;為結束符,而儲存過程中也包含了分號,因此會錯誤把這部分分號當成是結束符,造成語法錯誤。
    2. 包含 in、out 和 inout 三種引數。
    3. 給變數賦值都需要用 select into 語句。
    4. 每次只能給一個變數賦值,不支援集合的操作。

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 語句,而是被該語句檢索出來的結果集。
  • 在儲存過程中使用遊標可以對一個結果集進行移動遍歷。
  • 遊標主要用於互動式應用,其中使用者需要對資料集中的任意行進行瀏覽和修改。
  • 使用遊標的四個步驟:
    1. 宣告遊標,這個過程沒有實際檢索出資料;
    2. 開啟遊標;
    3. 取出資料;
    4. 關閉遊標;

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