「CSP2019」劃分(單調佇列優化dp)
阿新 • • 發佈:2021-07-25
儲存過程和函式
儲存過程和函式概述
儲存過程和函式是 事先經過編譯並存儲在資料庫中的一段 SQL 語句的集合,呼叫儲存過程和函式可以簡化應用開發人員的很多工作,減少資料在資料庫和應用伺服器之間的傳輸,對於提高資料處理的效率是有好處的。
儲存過程和函式的區別在於函式必須有返回值,而儲存過程沒有。
函式 : 是一個有返回值的過程 ;
過程 : 是一個沒有返回值的函式 ;
儲存過程
建立
CREATE PROCEDURE procedure_name ([proc_parameter[,...]])
begin
-- SQL語句
end ;
示例:
delimiter $ create procedure pro_test1() begin select 'Hello Mysql' ; end$ delimiter ;
**知識小貼士 **: DELIMITER
該關鍵字用來宣告SQL語句的分隔符 , 告訴 MySQL 直譯器,該段命令是否已經結束了,mysql是否可以執行了。預設情況下,delimiter是分號;
。
上面的示例,如果有不替換分隔符為$,那麼儲存過程將會在遇見sql語句後的分號結束,儲存過程並未執行完
呼叫
call [procedure_name]() ;
檢視儲存過程
-- 查詢db_name資料庫中的所有的儲存過程 select name from mysql.proc where db=['db_name']; -- 查詢儲存過程的狀態資訊 show procedure status; -- 查詢某個儲存過程的定義 show create procedure test.pro_test1 \G;
刪除
DROP PROCEDURE [IF EXISTS] procedure_name ;
變數
宣告
儲存過程是可以程式設計的,意味著可以使用變數,表示式,控制結構 , 來完成比較複雜的功能。
通過 DECLARE
可以定義一個區域性變數,該變數的作用範圍只能在 BEGIN…END 塊中
DECLARE var_name type [DEFAULT value]
delimiter $ create procedure pro_test2() begin declare num int default 5; select num+ 10; end$ delimiter ;
賦值
- 方式一:
set
- 方式二:
select ... into var_name
DELIMITER $
CREATE PROCEDURE pro_test3()
BEGIN
DECLARE NAME VARCHAR(20);
SET NAME = 'MYSQL';
SELECT NAME ;
END$
DELIMITER ;
DELIMITER $
CREATE PROCEDURE pro_test5()
BEGIN
declare countnum int;
select count(*) into countnum from city;
select countnum;
END$
DELIMITER ;
傳遞引數
create procedure procedure_name([in/out/inout] 引數名 引數型別)
...
- IN : 該引數可以作為輸入,也就是需要呼叫方傳入值 , 預設
- OUT: 該引數作為輸出,也就是該引數可以作為返回值
- INOUT: 既可以作為輸入引數,也可以作為輸出引數
示例
--根據定義的身高變數,判定當前身高的所屬的身材型別
delimiter $
create procedure pro_test5(in height int)
begin
declare description varchar(50) default '';
if height >= 180 then
set description='身材高挑';
elseif height >= 170 and height < 180 then
set description='標準身材';
else
set description='一般身材';
end if;
select concat('身高 ', height , '對應的身材型別為:',description);
end$
delimiter ;
--根據傳入的身高變數,獲取當前身高的所屬的身材型別
create procedure pro_test5(in height int , out description varchar(100))
begin
if height >= 180 then
set description='身材高挑';
elseif height >= 170 and height < 180 then
set description='標準身材';
else
set description='一般身材';
end if;
--定義了出參就不用再使用查詢sql
end$
--呼叫
call pro_test5(168, @description)$
select @description$
小貼士:
@description : 這種變數要在變數名稱前面加上
@
符號,叫做使用者會話變數,在當前會話中有效@@global.sort_buffer_size : 這種在變數前加上
@@
符號,叫做系統變數,在MySQL所有會話中都有效
示例
--從1加到n
delimiter $
create procedure pro_test8(n int)
begin
declare total int default 0;
declare num int default 1;
while num<=n do
set total = total + num;
set num = num + 1;
end while;
select total;
end$
delimiter ;
--案例:批量插入,根據次數插入到admin表中多條記錄,只插入偶數次
delimiter $
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<=insertCount DO
SET i=i+1;
IF MOD(i,2)!=0 THEN ITERATE a;
END IF;
INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua', i),'0000');
END WHILE a;
END $
CALL test_while1(100)$
leave
:類似於break,用於跳出所在的迴圈iterate
:類似於continue,用於結束本次迴圈,繼續下一次- 兩者語法一樣