一诅炉、變量
(一)局部變量
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]
(二)舉例
- 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 //
- 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 //
- 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 //
- 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 //
- 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 //
- 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í)行裁替。
- 語(yǔ)法
DECLARE handler_type HANDLER FOR condition_value [,...] sp_statement
-
敘述
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)使用步驟
- 必須先聲明游標(biāo)
- 必須打開游標(biāo)才能使用
- 通過(guò)游標(biāo)根據(jù)需要取出數(shù)據(jù)
- 使用完之后必須關(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可以是下述值之一:
- INSERT:將新行插入表時(shí)激活觸發(fā)程序。例如氯迂,通過(guò)INSERT践叠、LOAD DATA和REPLACE語(yǔ)句。
- UPDATE:更改某一行時(shí)激活觸發(fā)程序嚼蚀。例如禁灼,通過(guò)UPDATE語(yǔ)句。
- 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