一、存盤程序
什么是存盤程序,為什么要使用存盤程序以及如何使用存盤程序,并且介紹創建和使用存盤程序的基本語法,
什么是存盤程序:
存盤程序可以說是一個記錄集,它是由一些T-SQL陳述句組成的代碼塊,這些T-SQL陳述句代碼像一個方法一樣
實作一些功能(對單表或多表的增刪改查),然后再給這個代碼塊取一個名字,在用到這個功能的時候呼叫
他就行了,
存盤程序的好處:
由于資料庫執行動作時,是先編譯后執行的,然而存盤程序是一個編譯過的代碼塊,所以執行效率要比
T-SQL陳述句高,
一個存盤程序在程式在網路中互動時可以替代大堆的T-SQL陳述句,所以也能降低網路的通信量,提高通信速率,
通過存盤程序能夠使沒有權限的用戶在控制之下間接地存取資料庫,從而確保資料的安全
存盤程序的基本語法:
--------------------創建存盤程序------------------------------------ CREATE PROCEDURE procedure_name( IN|OUT variable data_type) BENGIN sql_statement; ...... END; -- MySQL支持IN(傳遞給存盤程序)、OUT(從存盤程序傳出) -- variable 變數 -- data_type 引數的資料型別 -- sql_statement 中 INTO parameter 的把值保存到相應的變數中(通過INTO關鍵字) --------------------執行存盤程序------------------------------------ CALL procedure_name(@parameters); --------------------洗掉存盤程序------------------------------------ DROP PROCEDURE procedure_name; -- 如果指定的程序不存在,則DROP PROCEDURE將會產生一個錯誤, -- 使用DROP PROCEDURE IF EXISTS --------------------檢查存盤程序------------------------------------ SHOW CREATE PROCEDURE procedure_name; ------------------------------------------------------------------- -- 為了獲得包括何時、有誰創建等詳細資訊的存盤程序串列,使用 SHOW PROCEDURE STATUS LIKE ' '; -- LIKE 指定過濾模式
備注:mysql命令列實用程式使用;作為陳述句分隔符,所以用命令列寫存盤程序自身內的;字符,會使存盤程序的SQL出現句法錯誤,解決辦法是臨時更改命令列的陳述句分隔符,如下所示:
-- 更改MySQL分隔符 除\符號外,任何字符都可以用作陳述句分隔符, DELIMITER // DELIMITER ;
存盤程序示例:
場景:
你需要獲得與以前一樣的訂單合計,但需要對合計增加營業稅,不過只針對某些顧客,那么,你需要做下面幾件事情:
獲得合計;
把營業稅有條件地添加到合計;
回傳合計(帶或不帶稅),
存盤程序的完整作業如下:
-- Name: ordertotal -- Parameters: onumber = order number -- taxable = 0 if not taxable, 1 if taxable -- ototal = order total variable DROP PROCEDURE IF EXISTS ordertotal; CREATE PROCEDURE ordertotal( IN onumber INT, IN taxable BOOLEAN, OUT ototal DECIMAL(8,2) ) COMMENT 'Obtion ordertotal, optionally adding tax' BENGIN -- Declare variable for total DECLARE total DECIMAL(8,2); -- Declare tax percentage 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 -- Yes, so add taxrate to the total SELECT total+(total/100*taxrate) INTO total; END IF; -- And finally, save to out variable SELECT total INTO ototal; END;
執行存盤程序:
CALL ordertotal(20005, 0, @total); SELECT @total;

CALL ordertotal(20005, 1, @total); SELECT @total;

二、游標
什么是游標以及如何使用游標,
什么是游標:
MySQL檢索操作回傳一組結果集,MySQL使用簡單的select陳述句沒有辦法得到第一行、下一行或前10行,也不能成批地處理它們,
游標可以從結果集中做到回傳單個結果
使用游標可以輕易的取出在檢索出來的行中前進或后退一行或多行的結果
游標可以遍歷回傳的多行結果,
補充:MySQL中游標只適用于存盤程序以及函式,
使用游標步驟:
在能夠使用游標前,必須宣告(定義)它,這個程序實際上沒有檢索資料,它只是定義要使用的select陳述句,
一旦宣告后,必須打開游標以供使用,這個程序用前面定義的select陳述句把資料實際檢索出來,
對于有資料的游標,根據需要取出(檢索)各行,
在結束游標使用時,必須關閉游標,
在宣告游標后,可根據需要頻繁地打開和關閉游標,在游標打開后,可根據需要頻繁地執行取操作,
語法:
定義游標
DECLARE <游標名> CURSOR FOR select陳述句;
打開游標
OPEN <游標名>;
使用游標
使用游標需要用關鍵字FETCH來取出資料,然后取出的資料需要有存放的地方,我們需要用declare宣告變數存放列的資料其語法格式為:
DECLARE variable1 資料型別(與列值的資料型別相同); FETCH [NEXT|PRIOR|FIRST|LAST] FROM <游標名> INTO [variable1,variable2,…]
關閉游標
CLOSE <游標名>;
游標示例:
DROP PROCEDURE IF EXISTS processorders; CREATE PROCEDURE processorders() BEGIN -- Declare local variables DECLARE done BOOLEAN DEFAULT 0; DECLARE o INT; DECLARE t DECIMAL(8,2); -- Declare the cursor DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; -- Declare continue handler DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; -- Create a table to store the result CREATE TABLE IF NOT EXISTS ordertotals( id INT PRIMARY KEY AUTO_INCREMENT, order_num INT NOT NULL, total DECIMAL(8,2) ); -- Open the cursor OPEN ordertotals; -- Loop through all rows REPEAT -- Get order number FETCH ordertotals INTO o; -- Get the total for this order CALL ordertotal(o, 1, t); -- Insert order and total into ordertotals INSERT INTO ordertotals(order_num, total) VALUES(o, t); -- End of loop UNTIL done END REPEAT; -- Close the cursor CLOSE ordertotals; END;
CALL ordertotal(); SELECT * FROM ordertotals;

三、MySQL學習腳本:
鏈接:https://pan.baidu.com/s/1U4HI-AC49ZUb730odAUkjw 提取碼:lti7
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227436.html
標籤:其他
上一篇:電腦玩和平精英跟手機組隊的方法
