MySQL 預存程序/遊標/觸發器/事務

來源:互聯網
上載者:User

標籤:

來源:http://www.cnblogs.com/zhuyp1015/p/3575823.html 將會用到的幾個表mysql> DESC products;+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| prod_id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| vend_id    | int(11)      | YES  |     | NULL    |                |
| prod_name  | varchar(100) | YES  |     | NULL    |                |
| prod_price | int(11)      | YES  |     | NULL    |                |
| prod_desc  | varchar(300) | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+ mysql> DESC orders;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| order_num  | int(11)     | NO   | PRI | NULL    | auto_increment |
| order_date | date        | YES  |     | NULL    |                |
| cust_id    | varchar(20) | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+ mysql> DESC orderitems;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| order_num  | int(11)     | NO   | PRI | NULL    | auto_increment |
| order_item | varchar(20) | YES  |     | NULL    |                |
| prod_id    | varchar(20) | YES  |     | NULL    |                |
| quantity   | int(11)     | YES  |     | NULL    |                |
| item_price | int(11)     | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+ 建立預存程序:參數需要指定 OUT / IN / INOUT  CREATE PROCEDURE productpricing(      OUT pl DECIMAL(8,2),      OUT ph DECIMAL(8,2),      OUT pa DECIMAL(8,2)) BEGIN      SELECT Min( prod_price)      INTO pl      FROM products ;     SELECT Max( prod_price)     INTO ph     FROM products;     SELECT Avg( prod_price)     INTO pa     FROM products; END; 調用預存程序:CALL productpricing( @pricelow, @pricehigh, @priceaverage); 選擇返回的值:SELECT @pricelow;SELECT @pricelow,@pricehigh,@priceaverage  --選擇多個 刪除預存程序:DROP PROCEDURE productpricing; ------------------------------------------------- CREATE PROCEDURE ordertotal(     INT onumber INT,     OUT ototal DECIMAL(8,2))BEGIN     SELECT sum(item_price * quantity)     FROM orderitems     WHERE order_num = onumber     INTO ototal;END; 調用:CALL ordertotal(20005, @total); SELECT @total; 預存程序實際情境:需要獲得以前一樣的訂單合計,但需要對合計增加營業稅,不過只針對某些顧客,那麼需要做:1. 獲得合計2. 把營業稅有田間的添加到合計3. 返回合計(帶或不帶稅) CREATE PROCEDURE ordertotal(IN onumber INT,IN taxable BOOLEAN,OUT octoal DECIMAL(8,2))BEGIN     -- 注釋 Declare variable for total     DECLARE total DECIMAL(8,2);     DECLARE taxrate INT DEFAULT 6;      -- Get the order total     SELECT Sum( item_price * quantity)     FROM orderitems     WHERE order_num = onumber     INTO total;      -- Is this taxable ?      IF taxable  THEN          SELECT total + (tatal / 100 *taxrate) INTO total;      END IF;          SELECT total INTO ototal;END;     CALL ordertotal(2005, 0, @total);SELECT @total; 檢查預存程序:SHOW CREATE PROCEDURE ordertoal; ----------------------------------------------------------------------------------------------------      SELECT 返回的是一個結果集,可能含有多行資料,有時候需要在檢索出來的行中前進或後退一行或多行。這就是使用遊標的原因。遊標(CURSOR) 是一個儲存在MySQL伺服器上的資料庫查詢,它不是一條SELECT語句,而是被語句檢索出來的結果集。在儲存了遊標之後應用程式可以根據需要滾動或瀏覽其中的資料。     遊標主要用於互動式應用,其中使用者需要滾動螢幕上的資料,並對資料進行瀏覽或作出更改。      MySQL遊標只能用於預存程序。使用遊標的步驟:1. 定義遊標(針對某個SELECT語句)2. 開啟遊標3. 對填有資料的遊標,根據需要取出各行4. 關閉遊標 簡單樣本:CREATE PROCEDURE processorders()BEGIN      DECLARE ordernumbers  CURSOR     FOR     SELECT order_num FROM orders;      OPEN ordernumbers;      CLOSE ordernumbers;END;---------------- 使用遊標資料 CREATE PROCEDURE processorders()BEGIN      DECLARE o INT;     DECLARE ordernumbers CURSOR     FOR     SELECT order_num FROM orders;      OPEN ordernumbers;       FETCH ordernumbers INTO o;      CLOSE ordernumbers;END;----------------迴圈檢索資料 CREATE PROCEDURE processorders()BEGIN      DECLARE o INT;     DECLARE done BOOLEAN DEFAULT 0;      DECLARE ordernumbers CURSOR     FOR     SELECT order_num FROM orders;      -- Declare continue handler     DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000‘ SET done = 1;     -- SQLSTATE ‘02000‘ 是一個未找到條件,當沒有更多行可讀的時候設定 done = 1 然後退出      OPEN ordernumbers;      REPEAT            FETCH ordernumbers INTO o;       UNTIL done  END REPEAT;      CLOSE ordernumbers;END;----------------------------------------------------------------------------------------------------------------使用table 記錄CURSOR FETCH 出來的值CREATE PROCEDURE processorders()BEGIN      DECLARE o INT;     DECLARE done BOOLEAN DEFAULT 0;     DECLARE t DECIMAL(8,2);      DECLARE ordernumbers CURSOR     FOR     SELECT order_num FROM orders;      -- Declare continue handler     DECLARE CONTINUE HANDLER FOR SQLSTATE ‘02000‘ SET done = 1;     -- SQLSTATE ‘02000‘ 是一個未找到條件,當沒有更多行可讀的時候設定 done = 1 然後退出      -- 建立table     CREATE TABLE IF NOT EXISTS ordertotals(          order_num INT, total DECIAML(8,2)     );      OPEN ordernumbers;      REPEAT            FETCH ordernumbers INTO o;          CALL ordertotal(o,1,t); -- 調用過程           -- 插入table          INSERT INTO ordertotals(order_num, total)          VALUES(o,t);       UNTIL done  END REPEAT;      CLOSE ordernumbers;END;----------------------------------------------------------------------------------------------------------觸發器:在事件發生的時候自動執行建立觸發器時,需要給出4條資訊:1.唯一的觸發器名2.觸發器關聯的表3.觸發器應該響應的活動(DELETE/ INSERT / UPDATE)4.觸發器何時執行--------------------CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT ‘Product added‘; --該例子觸發器在每次插入之後顯示 Product added 訊息 ---刪除觸發器 DROP TRIGGER newproduct; ----------------------------------------------------------------------------------------------------交易處理( transaction processing) 可以用來維護資料庫的完整性,它保證成批的MySQL操作要麼完全執行,要麼不執行。幾個術語:事務:transaction 指一組SQL語句回退:rollback 指撤銷指定SQL語句過程提交:commit 指將為儲存的SQL語句結果寫入資料庫表保留點:savepoint 指交易處理中設定的臨時預留位置,你可以對它發布退回-------------SELECT * FROM ordertotals; START TRANSACTION;DELETE FROM ordertotals; --刪除表SELECT * FROM ordertotals; -- 確認刪除 ROLLBACK; -- 復原SELECT * FROM ordertotal; -- 再次顯示 --------------commit一般的MySQL語句都是直接針對資料庫表進行操作,進行隱含的提交,即提交操作是自動執行的。在 交易處理中,提交不會隱含執行,需要使用COMMIT語句。START TRANSACTION;DELETE FROM orderitems WHERE order_num = 20010;DELETE FROM orders WHERE order_num = 20010;COMMIT;

MySQL 預存程序/遊標/觸發器/事務

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.