簡單的存儲過程:
delimiter $$ ----用命令行操作需要修改語句結束標誌
drop procedure if exists duan; ----如果存在duan則刪除
create procedure duan() ----創建 存儲過程
begin ----存儲過程代碼塊開始標誌
declare my_name varchar(32) default ''; ----定義變量,一個declare只能定義一個變量
set my_name='gao'; ----修改變量的值需要用set,也可通過select into 的方式
select context into my_name from t_monitor_object where username='shaomeng'; ---- 可以通過 select into 方式爲變量賦值
select my_name; ----可以通過select 將變量進行返回
end; ----存儲過程的結束標誌
$$ ----語句的結束標誌
delimiter ;
存儲過程的參數(傳入參數–IN,傳出參數–OUT類型,可變參數INOUT):
1. 傳入參數IN:一般只作爲傳入,不作爲修改和返回,如果不顯示指定參數類型,默認爲IN類型
(功能:讀取外部變量值,但有效範圍僅限於存儲過程的內部)
drop procedure if exists proc1;
create procedure proc1(IN my_uid int) ----IN可省略 不顯示指定參數類型,默認爲IN類型
begin
declare my_uname varchar(32) default '';
select username into my_uname from t_monitor_object where id=my_uid;
select my_uname;
select my_uid;
end;
call proc1(32) ----調用時所傳參數爲常量
select my_uid; ----因爲IN類型的參數不用於返回,在存儲過程之外不能進行查詢
2. 傳出參數OUT:傳入的爲變量,不能傳入具體值;在調用的過程中可以修改和返回
(功能:不讀取外部變量的值,在存儲過程執行完畢之後保留新值)
create procedure tt1(OUT i int) ----存儲過程的參數類型需定義在變量名稱之前
begin
select i; ----不管是第一次調用還是第二次調用存儲過程,該輸出均爲null,因爲OUT類型參數並不會帶入參數值
set i=2;
select i;
end;
set @aa=1; ----設置全局變量@aa的值爲1,可通過select @aa;調用查看內容
call tt1(@aa)
call tt1(@a) ----OUT類型參數爲變量,OUT類型參數前必須加@
select @a ----可以在存儲過程之外調用OUT類型參數,輸出爲2
3. 可變變量INOUT:傳入的爲變量;調用時可傳入值,並且可以修改、返回值。
(功能:讀取外部變量值,在存儲過程完畢後保留新值)
create procedure p1(INOUT i int)
begin
select i; ----輸出爲 1
set i = 10;
select i; ----輸出爲 10
end;
----下面代碼依次執行
set @a = 1;
select @a; ----輸出爲 1
call p1(@a);
select @a; ----輸出爲 10
存儲過程的條件語句:
- 條件語句的基本結構if() then …elseif() then … else … end if;【注意elseif之間沒有空格】
- if判斷返回邏輯真或者假,表達式可以是任意返回真或者假的表達式(可以爲SQL)
create procedure proc1(IN my_uid int)
begin
declare my_uname varchar(32) default '';
if(my_uid%2 =0)
then
select username into my_uname from t_monitor_object where id = my_uid;
elseif(my_uid = 31)
then set my_uname = 'gaoshaomeng';
else set my_uname = 'aaa';
end if;
select my_uname;
select my_uid;
end;
存儲過程的循環語句:
- while循環:
- while語句的基本結構爲:while() do begin … end; end while;
- while判斷返回邏輯真或者假,可以是任意返回boolean值的表達式(可以是包含SQL的複雜混合表達式)
- repeat循環語句:
- repeat語句的基本結構:repeat begin … end; until … end repeat;
- until 判斷返回邏輯真或者假,當爲真時,循環結束
------while循環
create procedure proc1(IN id_start int)
begin
declare flag int default 0;
while(flag<=10)
do
begin
insert into testa(id) values(id_start+flag);
set flag = flag+1;
end;
end while;
end;
call proc1(50)
------repeat循環
create procedure proc1(IN id_start int)
begin
declare flag int default 0;
delete from testa;
repeat
begin
insert into testa(id) values(flag+id_start);
set flag = flag +1;
end;
until flag>50
end repeat;
end;
call proc1(20)
函數的基本語法
drop function if exists func1; ----如果函數存在就刪除
create function getuname(uid int) returns varchar(32)
reads sql data ----函數的高級特性(可去掉),包含只讀的sql
begin
declare my_uname varchar(32) default '';
select username into my_uname from t_monitor_object where id =uid;
return my_uname;
end;
select getuname(47)
1. 創建函數使用create function 函數名(參數) returns 返回類型
遊標
- 存放cursor中單個值的變量應該比cursor先定義
(demo中的//1 應該在//2 之前)
create procedure proc1()
begin
declare stopflag int default 0;
declare my_id int; //1
declare id_cur cursor for select id from t_monitor_object where id%2=0; //2
declare continue handler for not found set stopflag = 1;
----定義類型爲continue的handler處理程序,當狀態值(condition_value)爲not found時設置stopflag值爲 1
open id_cur; -----需要打開遊標
fetch id_cur into my_id; -----抓取遊標中的第一個值
while(stopflag =0)
do
begin
update t_monitor_object set username = concat(username,'_test') where id=my_id;
fetch id_cur into my_id; -----繼續依次抓取遊標中的值
end;
end while;
Close id_cur; -----遊標需要手動關閉
end;
call proc1();
觸發器:
-
創建觸發器使用create trigger 觸發器名
after insert on t_monitor_object
在對錶t_monitor_object 執行插入語句之後觸發
after—可選–>before、afger
insert—可選—>insert、update、delete -
影響的範圍 for each row
-
應用案例:刪除某個表中某行數據時,將重要字段進行復制
-
當觸發器操作的表格操作失敗時,觸發觸發器的表格操作也會失敗
create trigger my_tri after insert on t_monitor_object
for each row
begin
insert into users(uname) values(new.username);
end;
case分支:
create procedure proce(my_id int)
begin
case
when my_id<50 then update t_monitor_object set id = id*5 where id=my_id;
-----then後面可 執行sql語句
when my_id<60 then update t_monitor_object set id = id*10 where id=my_id;
when my_id<70 then update t_monitor_object set id = id*20 where id=my_id;
else update t_monitor_object set id = id*20 where id=my_id;
end case;
end;
call proce(49)
declare處理程序與條件值示例
- Declare continue handler for not found sert stopflag=1;在SQLSTATE的條件值爲not found時,執行continue(handler_type)類型的handler處理程序
- 處理程序handler_type的選項
- Continue 在代碼塊中繼續,在循環中繼續下一次循環
- Exit 退出begin…end的代碼塊
- Undo(暫不支持)
- Declare continue handler for not found sert stopflag=1;或者爲:declare continue handler for SQLSTATE ‘23000’ set stopFlag=2;
- 條件值condition_value(紅色)
- SQLSTATE [VALUE]
- SQLWARNING 是對所有以01開頭的SQLSTATE代碼的速記
- NOT FOUNT 是對所有以02開頭的SQLSTATE代碼的速記
- SQLEXCEPTION 是對所有沒有被SQLWARNING或者NOT FOUND捕獲的SQLSTATE代碼的速記
示例:
(continue可改爲exit,insert的表字段id不可重複,插入多個1會報錯)
drop procedure if exists test_handler1;
create procedure test_handler1()
begin
declare stopFlag int default 1;
declare continue handler for SQLSTATE '23000' set stopFlag=2;
select stopFlag;
insert into testa(id) values(1);
set stopFlag=2;
select stopFlag;
insert into testa(id) values(1);
set stopFlag=3;
select stopFlag;
end;
call test_handler1()
▄█▀█●各位同仁,如果我的代碼對你有幫助,請給我一個贊吧,爲了下次方便找到,也可關注加收藏呀
如果有什麼意見或建議,也可留言區討論