1. 程式人生 > 其它 >Mysql 儲存過程之封裝查詢結果

Mysql 儲存過程之封裝查詢結果

文章概要

本文主要介紹,在使用儲存過程中,如何將單條多條查詢結果,賦值給變數或對其進行遍歷操作。

單條查詢結果處理

背景

有一張使用者表,包含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 使用

    1. 通過declare定義變數,處理器,遊標
    2. declare 只能在begin...end複合語句中使用,且必須定義在執行語句之前,即使執行語句未使用到該變數,也需要提前申明。
    3. declare 的申明是有順序的,變數必須定義在遊標與處理器申明之前,遊標必須定義在處理器申明之前
  • set 使用

    User variables are written as @var_name, @表示使用者變數

  • into 使用

    通過使用SELECT ... INTO var_list語法來將獲取的結果儲存到定義的變數中

    1. 變數定義的數量必須與查詢結果欄位數匹配
    2. 只能有一條返回結果

多條查詢結果處理

背景

有一張大體量使用者表,包含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,結束迴圈