mysql存储过程如何利用临时表返回结果集

作者:你好龙卷风!!! 时间:2024-01-13 07:39:05 

首先要声明的是

1,游标的方法会很慢在mysql中,在oracle数据库中还可以,除非没有别的方法,一般不建议在mysql中使用游标,

2,不建议在mysql中拼接sql,会使存储过程显得很臃肿,可以使用or来动态判别传入的参数是否为空

and  ( TTB.office_id=输入参数 or  输入参数 is null  or 输入参数 = '')
and  ( TTB.office_id=IN_Office_id or  IN_Office_id is null  or IN_Office_id = '')

3,不建议使用临时表来存储多用户下经常查询的内容,比如报表

4,返回结果集更好的方法是直接链接多个表返回结果集即可,下面的示例虽然给以得到正确结果,

但代码臃肿,速度异常的慢,可以当个反面教材

5,优化后的存储过程:https://www.jb51.net/article/263729.htm

测试示例 

BEGIN
#创建一个临时表
       DROP TABLE if  exists user_temporary;
create temporary table if not exists user_temporary
(
idVARCHAR(64) primary key,#id
user_name VARCHAR(20) #姓名

) ;
        begin

#定义 变量  接收id和姓名
          declare a VARCHAR(64);  
          declare b VARCHAR(20);

#这个用于处理游标到达最后一行的情况  

DECLARE s int default 0;  

#声明游标cursor_name(cursor_name是个多行结果集)  

DECLARE cursor_name CURSOR FOR select id ,name     from user ;  

#设置一个终止标记  

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;  

#打开游标  

OPEN cursor_name;  

#获取游标当前指针的记录,读取一行数据并传给变量a,b  

fetch  cursor_name into a,b;  
                   #开始循环,判断是否游标已经到达了最后作为循环条件  

while s <> 1 do  

insert into user_temporary(id,user_name) values(a,b);  
                           #读取下一行的数据  

fetch  cursor_name into a,b;  

end while;  

#关闭游标  

CLOSE cursor_name ;  

#从临时表中拿到结果集
SELECT  * from user_temporary;  

#语句执行结束  

end;

END

注意类型 为存储过程 procedure 不是存储函数function

运行结果:

mysql存储过程如何利用临时表返回结果集

真实需求,查找出所有用建单情况

BEGIN
       DROP TABLE if  exists user_temporary;
create temporary table if not exists user_temporary
(
idVARCHAR(64) primary key,id
user_name VARCHAR(20) ,#姓名
company_name VARCHAR(20) ,#所属公司
worksheet_num INTEGER,#机会点总数
sign_worksheet_num INTEGER  ,#签单数量
exchange_num INTEGER ,#填写交流记录次数
sales_volume double(20,2) #销售额
) ;
        begin

#定义 变量  
declare a_id VARCHAR(64);  
declare b_user_name VARCHAR(20);
declare c_company_name VARCHAR(20);
declare d_worksheet_num int ;
declare e_sign_worksheet_num int ;
declare f_exchange_num int ;
declare g_sales_volume double(20,2) ;

#这个用于处理游标到达最后一行的情况  

DECLARE s int default 0;  

#声明游标cursor_name(cursor_name是个多行结果集)  

DECLARE cursor_name CURSOR FOR
select a.id ,a.name ,o.name AS company_name   from sys_user a  LEFT JOIN sys_office o on a.company_id =o.id;  

#设置一个终止标记  

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;  

#打开游标  

OPEN cursor_name;  

#获取游标当前指针的记录,读取一行数据并传给变量a,b  

fetch  cursor_name into a_id,b_user_name ,c_company_name;  
                   #开始循环,判断是否游标已经到达了最后作为循环条件  

while s <> 1 do  

#读取下一行的数据  

#声明输入变量,以便在sql串中拼接

set @userId=a_id;
set @beginDate=begin_date;
set @endDate=end_date;

#收集总机会点 有if判断用拼接sql,然后再解析执行sql,
set  @exesqlAll =CONCAT('SELECT count(1) into @handle_num FROM crm_worksheet  

where  create_by=@userId and del_flag=0 ');

IF begin_date is not null and begin_date !=''  THEN
set@exesqlAll =CONCAT(@exesqlAll,' AND TO_DAYS(create_date) >=TO_DAYS(@beginDate)');
END IF;

IF end_date is not null and end_date !='' THEN
set@exesqlAll =CONCAT(@exesqlAll,' AND TO_DAYS(create_date) <=TO_DAYS(@endDate)');
END IF;

prepare allWorksheet from @exesqlAll;#解析sql
execute allWorksheet;#执行sql
DEALLOCATE prepare allWorksheet;#释放sql
SET  d_worksheet_num  = @handle_num;#变量赋值

IF d_worksheet_num > 0 THEN

set  @exesqlSign =CONCAT('SELECT count(1) into @sign_num FROM crm_worksheet  

where  create_by=@userId and del_flag=0  and important_degree=''sys_basic_qian_shu_he_tong'' ');

IF begin_date is not null and begin_date !=''  THEN
set@exesqlSign =CONCAT(@exesqlSign,' AND TO_DAYS(create_date) >=TO_DAYS(@beginDate)');
END IF;

IF end_date is not null and end_date !='' THEN
set@exesqlSign =CONCAT(@exesqlSign,' AND TO_DAYS(create_date) <=TO_DAYS(@endDate)');
END IF;

prepare signWorksheet from @exesqlSign;
execute signWorksheet;
DEALLOCATE prepare signWorksheet;
SET  e_sign_worksheet_num  = @sign_num;

#收集交流次数
set  @exesqlExchange =CONCAT('SELECT  COUNT(1) into @exchange_num from crm_wkst_exchange_record  e LEFT JOIN
crm_worksheet w on e.worksheet_no= w.worksheet_no where w.create_by=@userId and w.del_flag=0');

IF begin_date is not null and begin_date !=''  THEN
set@exesqlExchange =CONCAT(@exesqlExchange,' AND TO_DAYS(w.create_date) >=TO_DAYS(@beginDate)');
END IF;

IF end_date is not null and end_date !='' THEN
set@exesqlExchange =CONCAT(@exesqlExchange,' AND TO_DAYS(w.create_date) <=TO_DAYS(@endDate)');
END IF;

prepare exchangeWorksheet from @exesqlExchange;
execute exchangeWorksheet;
DEALLOCATE prepare exchangeWorksheet;
SET  f_exchange_num  = @exchange_num;

#收集销售额
set  @exesqlSales =CONCAT('SELECT (@sumSalary := @sumSalary + solution) AS count   into @sales_num   FROM crm_worksheet cw , (SELECT @sumSalary := 0) b
WHERE  cw.create_by=@userId and important_degree=''sys_basic_qian_shu_he_tong'' and cw.del_flag=0 ORDER BY   count desc limit 1 ');

IF begin_date is not null and begin_date !=''  THEN
set@exesqlExchange =CONCAT(@exesqlExchange,' AND TO_DAYS(cw.create_date) >=TO_DAYS(@beginDate)');
END IF;

IF end_date is not null and end_date !='' THEN
set@exesqlExchange =CONCAT(@exesqlExchange,' AND TO_DAYS(cw.create_date) <=TO_DAYS(@endDate)');
END IF;

prepare salesWorksheet from @exesqlSales;
execute salesWorksheet;
DEALLOCATE prepare salesWorksheet;
SET  g_sales_volume  = @sales_num;

ELSE  
SET e_sign_worksheet_num=0; SET f_exchange_num=0; SET g_sales_volume=0;

END IF;

insert into user_temporary(id,user_name,company_name,sign_worksheet_num,exchange_num,worksheet_num,sales_volume)
values(a_id,b_user_name,c_company_name,e_sign_worksheet_num,f_exchange_num,d_worksheet_num,g_sales_volume);  #插入临时表

fetch  cursor_name into a_id,b_user_name ,c_company_name;

end while;  

#关闭游标  

CLOSE cursor_name ;  

#从临时表中查出结果集
set @userIdInput=user_id;
set  @exesqlResult =CONCAT('SELECT  user_name,company_name,sign_worksheet_num,exchange_num,worksheet_num,sales_volume  from user_temporary');

IF user_id  is not null and user_id !=''  THEN
set@exesqlResult =CONCAT(@exesqlResult,'  where id = @userIdInput');
END IF;

prepare resultUser from @exesqlResult;
execute resultUser;
DEALLOCATE prepare resultUser;

#语句执行结束  

end;

END

运行结果

mysql存储过程如何利用临时表返回结果集

来源:https://blog.csdn.net/zhaofuqiangmycomm/article/details/88651446

标签:mysql,存储过程,临时表,结果集
0
投稿

猜你喜欢

  • 实例讲解Python爬取网页数据

    2023-01-10 03:55:05
  • Python返回数组/List长度的实例

    2023-10-12 14:03:28
  • 数据库之SQL技巧整理案例

    2024-01-26 00:46:27
  • Python基于动态规划算法解决01背包问题实例

    2021-01-10 21:22:26
  • Python的三个重要函数详解

    2022-05-19 04:58:45
  • 浅谈终端直接执行py文件,不需要python命令

    2022-12-25 14:38:11
  • YUI学习笔记(1)

    2009-01-12 18:06:00
  • Python计数器collections.Counter用法详解

    2021-06-02 20:30:18
  • 教你用Python写一个植物大战僵尸小游戏

    2021-07-19 22:59:37
  • AI经典书单 人工智能入门该读哪些书?

    2023-06-24 07:11:00
  • 8种用Python实现线性回归的方法对比详解

    2022-03-28 08:41:15
  • python中map()与zip()操作方法

    2023-11-11 08:09:29
  • 使用javaScript动态加载Js文件和Css文件

    2024-04-19 10:16:27
  • python SOCKET编程基础入门

    2021-04-20 17:22:33
  • tensorflow2.0教程之Keras快速入门

    2022-05-11 22:34:17
  • Go语言实现字符串切片赋值的方法小结

    2024-02-01 14:30:19
  • 如何正确的解决 MySQL中忽略用户的现象

    2008-11-27 16:00:00
  • Dreamweaver处理word文档有妙招

    2008-05-23 13:00:00
  • vue + typescript + video.js实现 流媒体播放 视频监控功能

    2024-05-09 15:10:38
  • Vue中axios的封装(报错、鉴权、跳转、拦截、提示)

    2024-05-02 17:06:03
  • asp之家 网络编程 m.aspxhome.com