1. 程式人生 > 其它 >「CSP2019」劃分(單調佇列優化dp)

「CSP2019」劃分(單調佇列優化dp)

儲存過程和函式

儲存過程和函式概述

儲存過程和函式是 事先經過編譯並存儲在資料庫中的一段 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,用於結束本次迴圈,繼續下一次
  • 兩者語法一樣