mysql資料庫學習11-儲存過程、函式、觸發器
儲存的程式
========================================
* 資料庫中儲存的程式,對資料進行運算處理
* 儲存過程
* 函式
* 觸發器
會話變數
========================================
* 一次會話過程中,可以設定一些變數儲存資料
* set @name='張三'
* @表示回話變數
* @@表示全域性變數,指定是系統變數
set @@sql_mode='STRICT_TRANS_TABLES';
set @@autocommit=OFF
set sql_mode='STRICT_TRANS_TABLES';
set autocommit=OFF
* 顯示變數的值
select @name, @a, @b, @c;
儲存過程
==================================================
* 建立儲存過程
delimiter // -- 設定語句的結束符號
create procedure p1()
begin
select * from t;
end;
//
delimiter ; -- 語句的結束符重新設定會成分號
* 呼叫儲存過程
call p1();
* 刪除儲存過程
drop procedure [if exists] p1;
* 引數
儲存過程的引數三種:
in 輸入引數(預設)
out 輸出引數
inout 即可輸入也可輸出
定義儲存過程: p2(in a int, out b int)
...
...
set b = a*2;
呼叫 p2():
call p2(255, @v1)
select @v1;
* 流程控制
*)選擇判斷
if 條件 then
...
end if;
-----------------
if 條件 then
...
else
...
end if;
==========================
case
when 條件 then ...;
when 條件 then ...;
when 條件 then ...;
else ...;
end case;
*) 迴圈
while 條件 do
...
end while;
---------------
loop
...
end loop;
---------------
repeat
...
until 條件 end repeat;
---------------
leave 跳出迴圈
iterate 直接進入下次迭代
---------------
迴圈命名
lp: loop
leave lp;
iterate lp;
end loop;
* declare
定義區域性變數
*) declare a int; -- null
*) declare a int default 1;
*) 區域性變數在 end 結束時銷燬
begin
declare a int default 1;
begin
declare b int default 2;
end;
select a; -- ok
select b; -- 錯誤
end;
函式
==================================================
* 與儲存過程類似,
* 函式有返回值
* 用 select f() 呼叫函式
* 建立
create function f(引數) returns int
begin
....
return 計算結果;
end;
遊標 cursor
==================================================
* 遊標: 查詢結果的資料指標
* 只能一步一步向下一行移動
* 不能任意的被定位
* 遊標操作:
*)定義遊標:
declare c cursor for select ...
*)開啟遊標:
open c;
*)從遊標取一行資料(自動下移):
-- 從遊標取出幾個欄位的資料,存入幾個變數
fetch c into v1,v2,v3,v4;
*)關閉遊標:
close c;
* 從頭到尾用遊標訪問資料
mysql 的錯誤處理機制:
declare continue handler for ...
當出現指定錯誤(not found)時,執行一段程式碼(done=),
使程式可以繼續正常執行(continue)
declare done int default 0;
declare c cursor for select ...
declare continue handler for not found set done=1;
open c;
while done=0 do
-- 在末尾取不到資料,會出現 not found 錯誤
-- 觸發 done=1 執行
fetch c into ...
end while;
觸發器
=============================================
* 對一行資料進行增刪改操作,
可以觸發一端程式碼執行
* 六種: 一張表最多就能建立6個觸發器
before insert
before update
before delete
after insert
after update
after delete
* 建立觸發器
create trigger 名稱 before insert
on tb1 for each row
begin
....
end;
* 兩個隱含物件
new - 新的資料行
old - 舊的資料行
new.id, new.name, new.price
old.id, old.name, old.price
*)插入操作
new - 新插入的一行資料
old - 沒有
*)修改操作
new - 修改後的新資料
old - 修改前的舊資料
*)刪除操作
new - 沒有
old - 被刪掉的資料