SQL基本語(yǔ)句(以MySQL為例)-- 第五部分

19拧簸、使用存儲(chǔ)過(guò)程
MySQL的存儲(chǔ)過(guò)程的語(yǔ)句跟這本書上的差太遠(yuǎn)了吧今艺,以下參考自:MySQL存儲(chǔ)過(guò)程教程

DELIMITER //  -- 先把分隔符“;”換成“//”走诞,以免非預(yù)期的語(yǔ)句結(jié)束
CREATE PROCEDURE mailing_list_count(
    OUT list_count INT
    -- OUT表示該參數(shù)用來(lái)返回值
    -- IN表示用來(lái)傳遞值
    -- INOUT更多查看上面的參考
)
BEGIN
    DECLARE v_rows INT;
    SELECT COUNT(*) INTO v_rows
    FROM customers
    WHERE NOT cust_email IS NULL;
    SET list_count = v_rows;
END//  -- 這里才是這整個(gè)CREATE PROCEDURE語(yǔ)句的結(jié)束
DELIMITER ;  -- 恢復(fù)分隔符為“;”屎飘,注意有個(gè)空格
CALL mailing_list_count(@count);  -- 調(diào)用存儲(chǔ)過(guò)程
SELECT @count;  --查看count的值

20会油、管理事務(wù)處理
事務(wù)處理用來(lái)確保一連串相關(guān)的表操作个粱,能夠全部執(zhí)行完畢,如果其中某步驟出錯(cuò)翻翩,則進(jìn)行回滾都许。
比如1個(gè)新顧客,下了1個(gè)訂單嫂冻,其中有2個(gè)商品胶征,將涉及到3個(gè)表的操作。
可以撤銷的操作:INSERT桨仿、UPDATE睛低、DELETE,不能撤銷的操作:SELECT服傍、CREATE钱雷、DROP。
嗯吹零,罩抗,,這個(gè)書上的例子瘪校,完全不能用在MySQL中

BEGIN;  -- 或者START TRANSACTION;
DELETE FROM orders WHERE order_num = 343242;
COMMIT;  -- 在執(zhí)行COMMIT前澄暮,都可以用ROLLBACK撤銷之前的所有操作
-- 帶保留點(diǎn)的回滾
BEGIN;
DELETE FROM orders WHERE order_num = 123;
SAVEPOINT delete1;
DELETE FROM orders WHERE order_num = 1212;
DELETE FROM orders WHERE order_num = 231;
ROLLBACK TO delete1;  -- 只撤銷SAVEPOINT delete1這句(保留點(diǎn))之后的語(yǔ)句

21、使用游標(biāo)
這里由于書上的例子完全不太適用于MySQL阱扬,所以參考:《MySQL必知必會(huì)》
首先MySQL中的游標(biāo)只能在存儲(chǔ)過(guò)程中泣懊,然后是只讀,只能往一個(gè)方向移動(dòng)麻惶,不能跳行

先定義另一個(gè)要用到的存儲(chǔ)過(guò)程

DELIMITER //
CREATE PROCEDURE OrderTotal(
    IN ONumber INT,
    OUT OTotal DECIMAL(8, 2)
)
BEGIN
    SELECT SUM(item_price * quantity)
    FROM orderitems
    WHERE order_num = ONumber
    INTO OTotal;
END//
DELIMITER ;

循環(huán)使用游標(biāo)馍刮,如果不用循環(huán)的話,相當(dāng)于只讀取了第一行

DELIMITER //
CREATE PROCEDURE ProcessOrders()
BEGIN
    -- 定義局部變量
    DECLARE done BOOLEAN DEFAULT 0;
    DECLARE o INT;
    DECLARE t DECIMAL(8, 2);

    -- 定義游標(biāo)
    DECLARE OrderNumbers CURSOR
    FOR
    SELECT order_num FROM orders;

    -- 定義CONTINUE HANDLER
    -- SQLSTATE '02000'是一個(gè)未找到條件窃蹋,當(dāng)REPEAT由于沒有更多的行供循環(huán)而不能繼續(xù)時(shí)卡啰,出現(xiàn)這個(gè)條件静稻。
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

    -- 創(chuàng)建一個(gè)新表用來(lái)存儲(chǔ)數(shù)據(jù),如果該表不存在的話
    CREATE TABLE IF NOT EXISTS ordertotals(
        order_num INT, total DECIMAL(8, 2)
    );
    
    OPEN OrderNumbers;
    REPEAT
        -- 讀取一行匈辱,下一次將讀取下一行
        FETCH OrderNumbers INTO o;
        CALL OrderTotal(o, t);  -- 調(diào)用前面的存儲(chǔ)過(guò)程振湾,返回總價(jià),存儲(chǔ)在變量t中
        INSERT INTO ordertotals(order_num, total)
        VALUES(o, t);
    UNTIL done END REPEAT;
    CLOSE OrderNumbers;
END//
DELIMITER ;

調(diào)用存儲(chǔ)過(guò)程亡脸,會(huì)在表ordertotals(如果不存在押搪,則先創(chuàng)建)中插入,每個(gè)訂單的總價(jià)值

CALL ProcessOrders();
SELECT * FROM ordertotals;
-- 輸出浅碾,這里為什么會(huì)有2個(gè)20008大州?沒搞清楚,垂谢,
+-----------+---------+
| order_num | total   |
+-----------+---------+
|     20005 | 1648.00 |
|     20009 | 1867.50 |
|     20006 |  329.60 |
|     20007 | 1696.00 |
|     20008 |  189.60 |
|     20008 |  189.60 |
+-----------+---------+

《SQL必知必會(huì)》最后一章就直接過(guò)目一下了厦画,之后再來(lái)掃一遍《MySQL必知必會(huì)》當(dāng)作加深記憶,因?yàn)楝F(xiàn)在根本用不到滥朱,所以就多看一遍根暑,不然很快就忘了

參考:SQL必知必會(huì)(第四版)
參考:MySQL必知必會(huì)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市焚虱,隨后出現(xiàn)的幾起案子购裙,更是在濱河造成了極大的恐慌懂版,老刑警劉巖鹃栽,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異躯畴,居然都是意外死亡民鼓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蓬抄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丰嘉,“玉大人,你說(shuō)我怎么就攤上這事嚷缭∫鳎” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵阅爽,是天一觀的道長(zhǎng)路幸。 經(jīng)常有香客問我,道長(zhǎng)付翁,這世上最難降的妖魔是什么简肴? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮百侧,結(jié)果婚禮上砰识,老公的妹妹穿的比我還像新娘能扒。我一直安慰自己,他們只是感情好辫狼,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布初斑。 她就那樣靜靜地躺著,像睡著了一般膨处。 火紅的嫁衣襯著肌膚如雪越平。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天灵迫,我揣著相機(jī)與錄音秦叛,去河邊找鬼。 笑死瀑粥,一個(gè)胖子當(dāng)著我的面吹牛挣跋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狞换,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼避咆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了修噪?” 一聲冷哼從身側(cè)響起查库,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎黄琼,沒想到半個(gè)月后樊销,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脏款,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年围苫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撤师。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡剂府,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剃盾,到底是詐尸還是另有隱情腺占,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布痒谴,位于F島的核電站衰伯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏闰歪。R本人自食惡果不足惜嚎研,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧临扮,春花似錦论矾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蚜退,卻和暖如春闰靴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钻注。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工蚂且, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人幅恋。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓杏死,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捆交。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淑翼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 《MySQL必知必會(huì)》學(xué)習(xí)筆記 目錄 http://www.reibang.com/p/97bab08c6755...
    leacoder閱讀 555評(píng)論 0 1
  • 前言 讀《sql必知必會(huì) 第四版》隨手做的筆記,寫的比較亂品追,可讀性并不好玄括,讀的是中文版,翻譯過(guò)來(lái)的感覺有點(diǎn)怪怪的肉瓦。...
    _老徐_閱讀 622評(píng)論 0 0
  • Mysql 快速指南 本文的示例在 Mysql 5.7 下都可以測(cè)試通過(guò)遭京。 知識(shí)點(diǎn) 概念 SQL 基礎(chǔ) 增刪改查 ...
    靜默虛空閱讀 737評(píng)論 0 2
  • 語(yǔ) 句 功 能 數(shù)據(jù)操作 SELECT——從數(shù)據(jù)庫(kù)表中檢索數(shù)據(jù)行和列INSERT——向數(shù)據(jù)庫(kù)表添加新數(shù)據(jù)行DELE...
    戰(zhàn)敭閱讀 5,075評(píng)論 0 53
  • 子查詢 子查詢是嵌套在其他查詢里的查詢,比如下面的例子 子查詢可以應(yīng)用在任何需要其結(jié)果的地方风宁,比如在其之上進(jìn)一步篩...
    Eu寫字的地方閱讀 932評(píng)論 0 0