MySQL--存儲過程--自定義函數--觸發器基礎語法彙總

簡單的存儲過程:

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()

▄█▀█●各位同仁,如果我的代碼對你有幫助,請給我一個贊吧,爲了下次方便找到,也可關注加收藏呀
如果有什麼意見或建議,也可留言區討論

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章