MySQL:存儲(chǔ)過(guò)程和觸發(fā)器

一诅炉、變量

(一)局部變量

DECLARE variable_name datatype(size) DEFAULT default_value;

此處聲明的相當(dāng)于一個(gè)局部變量黑滴,在end之后便失效罢荡。
聲明多個(gè):

DECLARE x, y INT DEFAULT 0

(二)會(huì)話變量

set @p=1;

此處的session變量不需要聲明赡突,mysql會(huì)自動(dòng)根據(jù)值類型來(lái)確定類型对扶,這種變量要在變量名稱前面加上“@”符號(hào),叫做會(huì)話變量惭缰,代表整個(gè)會(huì)話過(guò)程他都是有作用的浪南,這個(gè)有點(diǎn)類似于全局變量一樣。
這種變量用途比較廣漱受,因?yàn)橹灰谝粋€(gè)會(huì)話內(nèi)(就是某個(gè)應(yīng)用的一個(gè)連接過(guò)程中)络凿,這個(gè)變量可以在被調(diào)用的存儲(chǔ)過(guò)程或者代碼之間共享數(shù)據(jù)。

(三)變量賦值的方式

除了set昂羡,還可以使用select .....into.....的方式絮记。

(四)兩者的區(qū)別

在調(diào)用存儲(chǔ)過(guò)程時(shí),以DECLARE聲明的變量都會(huì)被初始化為NULL紧憾。而會(huì)話變量(即@開頭的變量)則不會(huì)被再初始化到千,在一個(gè)會(huì)話內(nèi),只須初始化一次赴穗,之后在會(huì)話內(nèi)都是對(duì)上一次計(jì)算的結(jié)果,就相當(dāng)于在是這個(gè)會(huì)話內(nèi)的全局變量膀息。

二般眉、存儲(chǔ)過(guò)程

為了方便現(xiàn)在和以后使用而保存起來(lái)的一條或者多條MySQL語(yǔ)句的集合。

(一)創(chuàng)建存儲(chǔ)過(guò)程

DELIMITER [end_label]
CREATE PROCEDURE sp_name([proc_parameter[,...]])
BEGIN
    [statement_list]
END [end_label]

(二)舉例

  1. out/in
delimiter //
create procedure pro_a(out t1 int, in t2 int)
begin
select chinese+english+math from student where id = t2 into t1;
end //
  1. if分支選擇語(yǔ)句
delimiter //
create procedure pro_b(in a int, in b int)
begin
if a>b then select 'a>b';
elseif a<b then select 'b>a';
end if;
end //
  1. case分支選擇語(yǔ)句
delimiter //
create procedure pro_c(in a int)
begin
case a
when 1 then select 'a=1';
when 2 then select 'a=2';
end case;
end //
  1. while循環(huán)語(yǔ)句
delimiter //
create procedure pro_d(in a int)
begin
while a>0 do
set a=a-1;
select a;
end while;
end //
  1. repeat循環(huán)語(yǔ)句
delimiter //
create procedure pro_e(in a int)
begin
repeat 
select a;
set a=a-1;
until a<0 end repeat;
end //
  1. loop循環(huán)語(yǔ)句
delimiter //
create procedure pro_f(in a int)
begin
test:loop
select a;
set a=a-1;
if a<0 then leave test;
end if;
end loop test;
end //

(三)調(diào)用存儲(chǔ)過(guò)程

CALL sp_name([proc_parameter[,...]]);

(四)刪除存儲(chǔ)過(guò)程

DROP PROCEDURE sp_name;

(五)自定義異常處理

在 MySQL 中潜支,特定異常需要特定處理甸赃。這些異常可以聯(lián)系到錯(cuò)誤冗酿,以及子程序中的一般流程控制埠对。異常處理定義了在遇到問(wèn)題時(shí)對(duì)應(yīng)當(dāng)采取的處理方式,并且保證存儲(chǔ)過(guò)程或者函數(shù)在遇到錯(cuò)誤時(shí)或者警告時(shí)能夠繼續(xù)執(zhí)行裁替。

  1. 語(yǔ)法
DECLARE handler_type HANDLER FOR condition_value [,...] sp_statement
  1. 敘述
    handler_type 表示錯(cuò)誤處理方式项玛。
    參數(shù)為 CONTINUE | EXIT | UNDO 中的 3 個(gè)值之一。
    CONTINUE 表示遇到錯(cuò)誤不處理弱判,繼續(xù)執(zhí)行襟沮;
    EXIT 表示遇到錯(cuò)誤時(shí)馬上退出;
    UNDO 表示遇到錯(cuò)誤后撤回之前的操作昌腰, MySQL 暫不支持回滾操作开伏。
    condition_value 表示錯(cuò)誤類型并扇。
SQLSTATE [VALUE] sqlstate_value| mysql_error_code

sqlstate_value 為包含 5 個(gè)字符的字符串錯(cuò)誤值区宇;
mysql_error_code 匹配數(shù)值類型錯(cuò)誤代碼;

三轴术、游標(biāo)

游標(biāo)主要用于在檢索出來(lái)的行中進(jìn)行前后按一行或多行滾動(dòng)的瀏覽數(shù)據(jù)的情況下劫流。游標(biāo)主要用于交互式應(yīng)用巫玻。MySQL游標(biāo)只能用于存儲(chǔ)過(guò)程丛忆。

(一)游標(biāo)使用步驟

  1. 必須先聲明游標(biāo)
  2. 必須打開游標(biāo)才能使用
  3. 通過(guò)游標(biāo)根據(jù)需要取出數(shù)據(jù)
  4. 使用完之后必須關(guān)閉游標(biāo)

(二)舉例

delimiter //
create procedure cursor_proc()
begin
declare done boolean default 0;
declare id int;

/*聲明游標(biāo),select 并不會(huì)檢索數(shù)據(jù)*/
declare testcousor cursor
for
select sno from student;

/*自定義異常處理*/
declare continue handler for sqlstate '02000' set done = 1;
/*當(dāng)sqlstate ‘02000’ 出現(xiàn)時(shí)大审,set done = 1蘸际。sqlstate ‘02000’ 是一個(gè)未找到狀態(tài)。*/

open testcousor;
test1:loop
fetch testcousor into id;
if done then leave test1;
end if;
select id,sum(grade) from score where studentsid = id;
end loop;
close testcousor;

end //

四徒扶、觸發(fā)器

觸發(fā)器是一個(gè)特殊的存儲(chǔ)過(guò)程粮彤,不同的是存儲(chǔ)過(guò)程要用CALL來(lái)調(diào)用,而觸發(fā)器不需要使用CALL姜骡,也不需要手工啟動(dòng)导坟,只要當(dāng)一個(gè)預(yù)定義的事件發(fā)生的時(shí)候,就會(huì)被MYSQL自動(dòng)調(diào)用圈澈。

(一)創(chuàng)建觸發(fā)器

語(yǔ)法

CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt

敘述
觸發(fā)程序是與表有關(guān)的命名數(shù)據(jù)庫(kù)對(duì)象惫周,當(dāng)表上出現(xiàn)特定事件時(shí),將激活該對(duì)象康栈。

tbl_name

觸發(fā)程序與命名為tbl_name的表相關(guān)递递。tbl_name必須引用永久性表。不能將觸發(fā)程序與臨時(shí)表表或視圖關(guān)聯(lián)起來(lái)啥么。

trigger_time

觸發(fā)程序的動(dòng)作時(shí)間登舞。它可以是BEFORE或AFTER,以指明觸發(fā)程序是在激活它的語(yǔ)句之前或之后觸發(fā)悬荣。

trigger_event

指明了激活觸發(fā)程序的語(yǔ)句的類型菠秒。
trigger_event可以是下述值之一:

  1. INSERT:將新行插入表時(shí)激活觸發(fā)程序。例如氯迂,通過(guò)INSERT践叠、LOAD DATA和REPLACE語(yǔ)句。
  2. UPDATE:更改某一行時(shí)激活觸發(fā)程序嚼蚀。例如禁灼,通過(guò)UPDATE語(yǔ)句。
  3. DELETE:從表中刪除某一行時(shí)激活觸發(fā)程序驰坊。例如匾二,通過(guò)DELETE和REPLACE語(yǔ)句。

對(duì)于具有相同觸發(fā)程序動(dòng)作時(shí)間和事件的給定表拳芙,不能有兩個(gè)觸發(fā)程序察藐。例如,對(duì)于某一表,不能有兩個(gè)BEFORE UPDATE觸發(fā)程序舟扎。但可以有1個(gè)BEFORE UPDATE觸發(fā)程序和1個(gè)BEFOREINSERT觸發(fā)程序分飞,或1個(gè)BEFORE UPDATE觸發(fā)程序和1個(gè)AFTER UPDATE觸發(fā)程序。

trigger_stmt

當(dāng)觸發(fā)程序激活時(shí)執(zhí)行的語(yǔ)句睹限。如果你打算執(zhí)行多個(gè)語(yǔ)句譬猫,可使用BEGIN ... END復(fù)合語(yǔ)句結(jié)構(gòu)讯檐。這樣,就能使用存儲(chǔ)子程序中允許的相同語(yǔ)句染服。

(二)查看觸發(fā)器

SHOW TRIGGERS

(三)刪除觸發(fā)器

DROP TRIGGER [schema_name.]trigger_name
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末别洪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子柳刮,更是在濱河造成了極大的恐慌挖垛,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秉颗,死亡現(xiàn)場(chǎng)離奇詭異痢毒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蚕甥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門哪替,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人菇怀,你說(shuō)我怎么就攤上這事凭舶。” “怎么了爱沟?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵库快,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我钥顽,道長(zhǎng),這世上最難降的妖魔是什么靠汁? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任蜂大,我火速辦了婚禮,結(jié)果婚禮上蝶怔,老公的妹妹穿的比我還像新娘奶浦。我一直安慰自己,他們只是感情好踢星,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布澳叉。 她就那樣靜靜地躺著,像睡著了一般沐悦。 火紅的嫁衣襯著肌膚如雪成洗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天藏否,我揣著相機(jī)與錄音瓶殃,去河邊找鬼。 笑死副签,一個(gè)胖子當(dāng)著我的面吹牛遥椿,可吹牛的內(nèi)容都是我干的基矮。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼冠场,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼家浇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起碴裙,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钢悲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后青团,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體譬巫,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年督笆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芦昔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娃肿,死狀恐怖咕缎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情料扰,我是刑警寧澤凭豪,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站晒杈,受9級(jí)特大地震影響嫂伞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拯钻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一帖努、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粪般,春花似錦拼余、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至小作,卻和暖如春亭姥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躲惰。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工致份, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人础拨。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓氮块,卻偏偏與公主長(zhǎng)得像绍载,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滔蝉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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