mysql存儲過程和存儲函數的使用

  • 2019 年 12 月 18 日
  • 筆記

mysql存儲過程設置:

delimiter // #將mysql的結束符設置為//

create procedure name(IN | OUT |INOUT str STRING) #定義存儲過程名字

begin #開始存儲過程

select * from tables; #執行過程

end // #結束存儲過程

delimiter ; #將mysql的結束符設置為;

call name(); #存儲過程調用

drop procedure if exists name #存儲過程刪除

mysql儲存函數設置:

delimiter // #將mysql的結束符設置為//

create function name(IN | OUT |INOUT str STRING) #定義函數名字

returns int #定義函數返回結果類型

return (select count(*) from tables); #執行過程

// #結束函數

delimiter ; #將mysql的結束符設置為;

select name(); #儲存函數調用

drop function if exists name #儲存函數刪除

實例:

DELIMITER // #將mysql的結束符設置為//

CREATE FUNCTION count_job() #定義函數名字

RETURNS INT #定義函數返回結果類型

RETURN (SELECT COUNT(*) FROM job); #執行過程

// #結束函數

DELIMITER ; #將mysql的結束符設置為;

SELECT count_job(); #儲存函數調用

DELIMITER // #將mysql的結束符設置為//

CREATE PROCEDURE add_id(out num INT) #定義存儲過程名字

BEGIN #開始存儲過程

DECLARE itmp INT; #定義變量

DECLARE cur_id CURSOR FOR SELECT id FROM job; #聲明光標

DECLARE EXIT HANDLER FOR NOT FOUND CLOSE cur_id; #定義處理程序

SELECT count_job() INTO num; #執行存儲函數並賦值

SET @sum=0; #定義變量

OPEN cur_id; #打開光標

REPEAT #流程控制

FETCH cur_id INTO itmp; #使用光標

IF itmp<10 #流程控制

THEN SET @sum=@sum+itmp; #變量賦值

END IF; #流程控制

UNTIL 0 END REPEAT; #流程控制

CLOSE cur_id; #關閉光標

END // #結束存儲過程

DELIMITER ; #將mysql的結束符設置為;

call add_id(@num); #存儲過程調用

select @num,@sum; #查詢結果

mysql定義處理程序的方式:

#捕獲sqlstate_value

declare continue handler for sqlstate '42S02' set @info='NO_SUCH_TABLE';

捕獲sqlstate_value,如果遇到sqlstate_value值為42S02執行continue並輸出NO_SUCH_TABLE

#捕獲mysql_error_code

declare continue handler for 1146 set @info='NO_SUCH_TABLE';

捕獲mysql_error_code,如果遇到mysql_error_code值為1146執行continue並輸出NO_SUCH_TABLE

#先定義條件,然後調用

declare no_such_table continue for 1146;

declare continue handler for NO_SUCH_TABLE set @info='NO_SUCH_TABLE';

先定義條件,然後調用條件,遇到1146執行continue操作

#使用sqlwarning

declare exit handler for sqlwarning set @info='ERROR';

使用sqlwarning,捕獲01開頭的sqlstate_value然後執行exit操作並輸出ERROR

#使用not found

declare exit handler for not found set @info='NO_SUCH_TABLE';

使用not found,捕獲02開頭的sqlstate_value然後執行exit操作並輸出NO_SUCH_TABLE

#使用sqlexception

declare exit handler for sqlexception set @info='ERROR';

使用sqlexception,捕獲沒有被sqlwarning和not found捕獲的sqlstate_value的值,然後執行exit操作並輸出ERROR