1. 程式人生 > >mysql 初級篇(三) 觸發器、儲存過程、遊標

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