MySQL——自定義[存儲]函數、觸發器


一. 編程基礎

1)        結束符

 

 

2)        代碼塊

Begin 相當於 {

end;  相當於 }

1.    變量

系統變量

Show variables; 

 

查看系統變量sql_mode

1 會話變量
2 Set @變量名=值;

 

 

局部變量 // 在函數或過程內部定義的變量

1 Declare 變量名 類型 default 默認值;
2 
3 Declare  I  int default 0;

2.    循環while

1 變量初始化;
2 
3 [名稱]:While 條件判斷 do
4 
5 循環體;
6 
7 增量;
8 
9 End 空格 while;
delimiter //
create function mywhile(n int) returns int
    begin
        declare i int default 0;
        declare sum int default 0;

        while i <= n do
            set sum = sum + i;
            set i = i +1;
        end while;
        return  sum;
    end;
//
delimiter ;

調用函數:

1 select mywhile(100);

3.    判斷if

If 條件 then

         return 返回值;

Elseif 條件 then

         return 返回值;

Else

         return 返回值;

End if;
delimiter //
create function checkuser(name varchar(11)) returns varchar(11)
    begin
        if name = 'admin' then
            return "ok";
        else 
            return "no";
        end if;
    end;
//
delimiter ;

 

二.自定義[存儲]函數

1)        創建自定義函數

Create  Function 名稱(參數 數據類型) returns 數據類型

說明:

create function 關鍵字
名稱  //自定義函數名稱,用來調用.
([參數 數據類型])  //形參為可選
Returns 數據類型 //指明返回值的類型, 注意:returns
注意:自定義函數體中必須有返回值 使用關鍵字return
 

沒有參數的:

delimiter //
create function test() returns varchar(11)
    begin
        return 'ok';
    end;
//
delimiter ;

2)        調用函數

Select 函數名稱([參數]);

說明: select 函數名稱([參數]) // 根據定義函數時形參.  ,形參與實參保持一致.

 

 

3)        查看創建函數信息

show create function 函數名稱 \G

4)        查看所有自定義函數

1 show function status \G

5)        刪除自定義函數

1 Drop function 函數名稱; 

如果當前數據庫不是db_five

Drop function db_five.mywhile;

自定義函數中可以執行的SQL語句: delete, update,insert

 

 

 

三.存儲過程

概念: 存儲過程就是一條或多條SQL語句的集合.即沒有返回值的存儲函數

 

delimiter //
create procedure myselect() 
    begin
         select * from student;
    end;
//
delimiter ;

 

 

 

 

1.    定義存儲過程

 

Create procedure 過程名稱(in 參數 類型,out 參數 類型 inout 參數 類型)

 

說明:

 

1)        Create procedure  // 創建過程關鍵字

 

2)        In 參數 數據類型 (默認)  //類似於php中的拷貝傳值

 

3)        Out 參數 數據類型   //類似於php中的引用傳值, 傳遞到過程中將這個變量賦值為NULL;

 

4)        Inout 參數 數據類型  //類似於php中的引用傳值;

 

 

delimiter //
create procedure mytest(in a int, out b int,inout c int) 
    begin
         select a,b,c;
         set a=11,b=22,c=33;
         select a,b,c;
    end;
//
delimiter ;

 

2.    調用存儲過程

Call 過程名稱( [參數])

3.    查看創建存儲過程信息

Show create procedure 過程名稱

 

4.    查看所有存儲過程

Show procedure status \G 

5.    刪除存儲過程

Drop procedure 過程名稱

 

 

四.觸發器

概念: 觸發器是由事件來觸發某個操作,這些事件包括INSERT、UPDATE和DELETE語句。當執行這些事件時,就會激活觸發器執行相應的操作。

1.    創建觸發器

create trigger 名稱 after|before 事件 insert|update|delete  on 表名  for each row

說明:

1)        Create trigger //創建觸發器的關鍵字

2)        名稱

3)        After|before , 觸發時機

4)        insert|update|delete  //事件

5)        on 表名 //作用於哪張表

6)        for each row //觸發器是基於行. 

nowtime  //id,nowtime;
nowuser  //id,name

在用戶表中添加用戶時,通過觸發器會自動在nowtime表中將當前的時間添加

delimiter //
create trigger tg1 after insert on nowuser for each row
    begin
        insert into nowtime values (null,now());
    end;
//
delimiter ;

2.    兩個關鍵字: new, old

在觸發器中,當觸發事件發生時,

new : 代表新行, old: 代表舊行

insert 操作: 成功之后,其后會自動產生一行新的數據. 在觸發器中通過new獲取新行字段值

delete 操作, 其成功之后, 對舊行數據進行刪除,在觸發器中可以通過old獲取舊行字段值

update操作: 其會對原有的舊行,更新為新行. 既有新行又有舊行

 

insert 事件

delimiter //
create trigger tg1 after insert on tb_order for each row
    begin
        update tb_goods  set inv = inv - new.num where  id = new.pid;
    end;
//
delimiter ;

Delete  事件:

 

-- delete 
delimiter //
create trigger  tg2 after delete on tb_order for each row
    BEGIN    
          update tb_goods set inv = inv + old.num where id = old.pid;
    end;
//
delimiter ;

 

 

 

Update 事件:

New,old

 

delimiter //
create trigger tg3 after update on tb_order for each row
    begin
        update tb_goods  set inv = inv + old.num - new.num where  id = old.pid;
    end;
//
delimiter ;

3.    顯示所有觸發器

Show triggers \G

 

4.    刪除觸發器

Drop trigger 觸發器名稱

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM