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