mysql 初級篇(三) 觸發器、儲存過程、遊標
mysql 初級篇(三)
觸發器、儲存過程、遊標
觸發器trigger
Creat trigger buggood
After
Insert
On ord
For each row
Begin
Update goods set num=num-new.much where id=new.gid
End
New insert 來引用,因為insert插入新的行,所以用new來引用
Old delete 來引用,因為delete刪除記錄,是因為記錄原來就已經存在,所以用old來引用。
For each row的作用:每一行受影響,觸發器都執行,叫做行級觸發器。
檢視觸發器:show trigger
刪除觸發器:drop trigger triggerName
過程:封裝了若干條語句,呼叫時,執行封裝體,但沒有返回值。
函式:是一個有返回值的“過程”。
儲存過程:procedure;
Create procedure testName()
Begin
Sql語句;
end
檢視儲存過程:show procedure status
呼叫儲存過程:call procedure()
Create procedure t1()
Begin
Declare age int;
Select concat(‘age:’,age)
End
變數可以sql語句中合法的運算;
Set 變數名:=expression
Create procedure t2()
Begin
Declare age int default 18;
Set age:=age+10;
Select userInfo(“real age : ”, age);
End
Create procedure t3()
Begin
Declare age int default 18;
If age>=18 then
Select ‘已成年’ ;
Else
Select “未成年” ;
End if ;
儲存過程中宣告引數,語法是:[in/out/inout] 引數名 引數型別
Create procedure t3(age int)
Begin
If age >=18 then
Selec “已成年” ;
Else
Select “未成年” ;
End if ;
end
控制結構:順序,分支,迴圈
Create procedure t4()
Begin
Declare total int default 0 ;
Declare num int default 0 ;
While num <=100 do
Set total := total + num ;
Set num := num +1 ;
End while;
Select total ;
End
In 是指接收引數
Create procedure t5(in n int)
Begin
Declare total int default 0;
Declare num int default 0;
while num <=n do
Set :=total+sum ;
Set :=sum+ 1 ;
End while;
End
Call t5(100) --呼叫儲存過程
Out 是指往外部發射一個引數,呼叫時,要提供引數用於儲存結果的值
Create procedure t6(in n int,out total int)
Begin
Declare total int default 0;
Set total :=0;
while num <=n do
Set :=total+sum ;
Set :=sum+ 1 ;
End while;
End
Call t6(100,@sumary) --呼叫儲存過程
Inout 是指即可以傳遞引數,也可以發射出引數。
Create procedure t7()
Begin
Declare age int default 1;
Case age
When 10 then select “chid” ;
When 20 then select “student” ;
Else select “not data”
End case;
end
Repeat 迴圈
語句:
Repeat
Sql 語句;
Until i>=100 end repeat; --結束迴圈條件
Create procedure t8()
Begin
Declare i :=0;
Declare total :=0;
Repeat
Set i:=i+1;
Set total:=total+i ;
Until i<=100 end repeat;
Select total;
End
遊標 cursor ;
對應N條結果集的資源,取出資源的介面/控制代碼,就是遊標,沿著遊標,可以一次取1行。
Declare 宣告遊標;declare 遊標名 cursor for select_statement;
Open 開啟遊標,open 遊標名
Fetch 取值;fetch 遊標名 into var1,var2....
Close 關閉;close 遊標名
Create procedure t9()
Begin
Declare row_gid int;
Declare row_num int ;
Declare row_name varchar(20);
Declare getgoods cursor for select gid,num,name from goods;
Open cursor;
Fetch getgoods into row_gid,row_num,row_name;
Select row_gid,row_num ;
Close getgoods;
end
Create procedure t10()
Begin
Declare row_gid int ;
Declare row_num int;
Declare row_name int ;
Declare cnt int default 0;
Declare i int default 0;
Declare getgoods cursor for select gid,num,name from goods;
Select count(gid) into cnt from goods;
Open getgoods;
Repeat
Fetch getgoods into row_gid,row_num,row_name;
Set cnt:= cnt -1;
Select row_gid,row_num,row_name;
Until cnt=0 end repeat;
Close getgoods;
End
遊標取值越界時,利用標識來結束,在mysql cursor 中,可以declare continue handle 來操作1個越界標識。
Declare continue handler for not Found statement;
Create procedure t10()
Begin
Declare row_gid int ;
Declare row_num int;
Declare row_name int ;
Declare cnt int default 0;
Declare yes int default 1;
Declare getgoods cursor for select gid,num,name from goods;
Declare continue handler for not Found set yes:=0;
Select count(gid) into cnt from goods;
Open getgoods;
Fetch getgoods into row_gid,row_num,row_name;
Repeat
Select row_gid,row_num,row_name;
Fetch getgoods into row_gid,row_num,row_name;
Until yes=0 end repeat;
Close getgoods;
End