热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

存储过程的输入输出参数在sql串中的拼写

现有存储过程包含两个输入参数和四个输出参数实体类:privateStringuserId;用户idprivateStringuserName;用户姓名privat

现有存储过程包含两个输入参数和四个输出参数

实体类:

private String userId;//用户id
private String userName;//用户姓名
private String officeId;//部门id
private String officeName;//部门名称
private Integer createWkstNum;//创建工单数
private Integer handleNum;//待处理工单数
private Integer claimNum;//待认领工单数
private Integer alreadyHandleNum;//已办理工单数
private Integer overdueNum;//已超期工单数
private String workNo;//工号

mapper文件

 

  {call p_wkststate_num_by_userids(
  #{beginDate,mode=IN,jdbcType=VARCHAR},
  #{endDate,mode=IN,jdbcType=VARCHAR},

 
  #{userId,mode=IN,jdbcType=VARCHAR},
  #{officeId,mode=IN,jdbcType=VARCHAR},
 
  #{overdueNum,mode=OUT,jdbcType=INTEGER},
 
  #{handleNum,mode=OUT,jdbcType=INTEGER},
  #{claimNum,mode=OUT,jdbcType=INTEGER},
  #{alreadyHandleNum,mode=OUT,jdbcType=INTEGER}
  )} 
 
]]> 

存储过程变为:

为了方便,双斜杠为注释符号

 

1,输入参数用‘,参数,’标记

2,输出参数用@参数标记

3,需要注意的是在拼接sql串的情况下,java代码传输入的字符串参数需要强制加单引号

否则传到sql的时候就没有单引号了,会报错

如: uv.setEndDate("'"+uVo.getEndDate()+"'");
uv.setUserId("'"+uv.getUserId()+"'");
uv.setOfficeId("'"+uv.getOfficeId()+"'");

否则sql解析时则不是字符串

4,mapper中没有日期类型的参数

TO_DAYS(日期)解析字符串日期

 


 

BEGIN


set @exesqloverdue =CONCAT('SELECT count(1) into@overdue_num  FROM crm_worksheet a    
LEFT JOIN crm_worksheet_flow wf ON wf.id = a.worksheet_flow_id
where now()>wf.handle_term_date and a.worksheet_state=3 and wf.handle_per= ',user_id,' ');
IF begin_date is not null and begin_date !=''  THEN
set @exesqloverdue =CONCAT(@exesqloverdue ,' AND TO_DAYS(a.update_date) >= TO_DAYS(',begin_date,')');     //CONCAT 追加sql串
END IF;


IF end_date is not null and end_date !='' THEN
set &#64;exesqloverdue &#61;CONCAT(&#64;exesqloverdue ,&#39; AND TO_DAYS(a.update_date) <&#61; TO_DAYS(&#39;,end_date,&#39;)&#39;);
END IF;
prepare overdue from &#64;exesqloverdue;//编译字符串
  execute overdue;//运行字符串
SET overdue_num &#61; &#64;overdue_num  ;//为返回参数赋值


set  &#64;exesqlhandle &#61;CONCAT(&#39;SELECT count(1) into &#64;handle_num FROM crm_worksheet a
LEFT JOIN crm_worksheet_flow wf ON wf.id &#61; a.worksheet_flow_id
where a.worksheet_state&#61;3 and wf.handle_per&#61;&#39;,user_id,&#39;&#39;  );
IF begin_date is not null and begin_date !&#61;&#39;&#39;  THEN
set &#64;exesqlhandle &#61;CONCAT(&#64;exesqlhandle ,&#39; AND TO_DAYS(a.update_date) >&#61; TO_DAYS(&#39;,begin_date,&#39;)&#39;);
END IF;


IF end_date is not null and end_date !&#61;&#39;&#39; THEN
set &#64;exesqlhandle &#61;CONCAT(&#64;exesqlhandle ,&#39; AND TO_DAYS(a.update_date) <&#61; TO_DAYS(&#39;,end_date,&#39;)&#39;);
END IF;


prepare handle from &#64;exesqlhandle;
  execute handle;
SET  handle_num &#61; &#64;handle_num  ;




set  &#64;exesqlclaimNum &#61;CONCAT(&#39;SELECT count(1) into &#64;claim_num FROM crm_worksheet a
LEFT JOIN crm_worksheet_flow wf ON wf.id &#61; a.worksheet_flow_id
where a.worksheet_state&#61;2 and wf.handle_org&#61;&#39;,office_id,&#39;&#39;);
IF begin_date is not null and begin_date !&#61;&#39;&#39;  THEN
set &#64;exesqlclaimNum &#61;CONCAT(&#64;exesqlclaimNum ,&#39; AND TO_DAYS(a.update_date) >&#61; TO_DAYS(&#39;,begin_date,&#39;)&#39;);
END IF;


IF end_date is not null and end_date !&#61;&#39;&#39; THEN
set &#64;exesqlclaimNum &#61;CONCAT(&#64;exesqlclaimNum ,&#39; AND TO_DAYS(a.update_date) <&#61; TO_DAYS(&#39;,end_date,&#39;)&#39;);
END IF;


prepare claimNum from &#64;exesqlclaimNum;
  execute claimNum;
SET claim_num &#61; &#64;claim_num  ;




set &#64;exesqlalready &#61;CONCAT(&#39;select count(1) into &#64;already_handle_num from crm_worksheet_flow a 
where a.flow_cmd&#61;1 
and a.handle_per is not null
and a.handle_org is not null
and a.handle_per !&#61;&#39;&#39; and a.handle_org !&#61;&#39;&#39;
and a.handle_per&#61;&#39;,user_id,&#39;&#39;) ;  


IF begin_date is not null and begin_date !&#61;&#39;&#39;  THEN
set &#64;exesqlalready &#61;CONCAT(&#64;exesqlalready ,&#39; AND TO_DAYS(a.update_date) >&#61; TO_DAYS(&#39;,begin_date,&#39;)&#39;);
END IF;


IF end_date is not null and end_date !&#61;&#39;&#39; THEN
set &#64;exesqlalready &#61;CONCAT(&#64;exesqlalready ,&#39; AND TO_DAYS(a.update_date) <&#61; TO_DAYS(&#39;,end_date,&#39;)&#39;);
END IF;


prepare already from &#64;exesqlalready;
  execute already;
SET already_handle_num &#61; &#64;already_handle_num  ;



END

 

 

 

参数&#xff1a;

in begin_date varchar(64),in end_date varchar(64),in user_id varchar(64),in office_id varchar(64),out overdue_num int,out handle_num int,out claim_num int,
out already_handle_num int

 

注意&#xff1a;

最近又对这个存储过程编写的时候发现一个bug:

sql串的拼写时时间的比较 一定要用  <&#61;  而不是  <   否则查询结果有误&#xff0c;真是奇了怪

环境&#xff1a;windows下的5.6.21 


推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
GXtingker
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有