Mysql 儲存過程之封裝查詢結果
阿新 • • 發佈:2022-03-22
文章概要
本文主要介紹,在使用儲存過程中,如何將
單條
或多條
查詢結果,賦值給變數或對其進行遍歷操作。
單條查詢結果處理
背景
有一張使用者表,包含id,name,age,gender四個屬性,通過接收id內容,返回該id對應的使用者以及年齡
create table `member` ( `id` bigint not null auto_increment, `name` varchar(30) not null, `age` int not null, `gender` tinyint(1) default 1 comment '0: female, 1:male', primary key(`id`) );
儲存過程
drop procedure if exists pro_get_member_info; delimiter $ create procedure pro_get_member_info(in member_id bigint, out member_name varchar(30), out member_age int) begin declare p_name varchar(30); declare p_age int default 18; select name, age into p_name, p_age from member where id = member_id; set member_name = p_name; set member_age = p_age; end $ delimiter ; call pro_get_member_info(1, @name, @age); select @name, @age;
-
declare 使用
- 通過declare定義變數,處理器,遊標
- declare 只能在
begin...end
複合語句中使用,且必須定義在執行語句之前,即使執行語句未使用到該變數,也需要提前申明。 - declare 的申明是有順序的,變數必須定義在遊標與處理器申明之前,遊標必須定義在處理器申明之前
-
set 使用
User variables are written as @var_name,
@
表示使用者變數 -
into 使用
通過使用
SELECT ... INTO var_list
語法來將獲取的結果儲存到定義的變數中- 變數定義的數量必須與查詢結果欄位數匹配
- 只能有一條返回結果
多條查詢結果處理
背景
有一張大體量使用者表,包含id,name,age,gender四個屬性,需要按性別進行分表,gender = 0 的資料放入到member_female表中,gender = 1的放入到member_male表中
create table `member` (
`id` bigint not null auto_increment,
`name` varchar(30) not null,
`age` int not null,
`gender` tinyint(1) default 1 comment '0: female, 1:male',
primary key(`id`)
);
create table `member_female` (
`id` bigint not null auto_increment,
`name` varchar(30) not null,
`age` int not null,
primary key(`id`)
);
create table `member_male` (
`id` bigint not null auto_increment,
`name` varchar(30) not null,
`age` int not null,
primary key(`id`)
);
儲存過程
drop procedure if exists pro_refactor_member;
delimiter $
create procedure pro_refactor_member()
begin
declare done int default false; -- 標記遊標位置
declare p_name varchar(30);
declare p_age int;
declare p_gender tinyint(1);
declare cur_member cursor for select name, age, gender from member; -- 定義遊標
declare continue handler for not found set done = true; -- 定義處理器
open cur_member;
read_member: loop
fetch cur_member into p_name, p_age, p_gender;
if done then
leave read_member; -- 讀取到最後,結束迴圈
end if;
if p_gender = 1 then
insert into member_male (name, age) values (p_name, p_age);
else
insert into member_female (name, age) values (p_name, p_age);
end if;
end loop;
close cur_member;
end
$
delimiter ;
call pro_refactor_member();
-
遊標申明
通過
declare cur_name cursor for select ···
申明遊標
通過open cur_name
開啟遊標
通過fetch cur_name into variables
設定變數或丟擲異常
通過close cur_name
關閉遊標 -
通過定義變數
done
與定義handler
來控制迴圈通過fetch去獲取查詢的下一條結果,如果沒有資料,則會觸發定義的
handler
,設定變數為true,結束迴圈