MySQL存储过程动态SQL语句的生成
用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率:
现在有要求如下:根据输入的年份、国家、节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率方面,表现方面并不是很理想,因此我选择使用拼接SQL语句来完成这个查询(因为有可能数据为空,所以一开始我选择使用的方式拼接字符串)
SQL语句如下:
(这是在Navicat上编辑的,可以直接写SQL其他的由Navicat自动生成)
BEGIN
set @country = country;/**输入的country参数**/
set @type = type;/**输入的节假日类型参数**/
set @_year = _year;/**输入的年份参数**/
set @tempsql = 'SELECT lh.lh_id,wp.location_id,wp.country,lh.starttime,lh.endtime,lh.type from workplace AS wp,legalholiday as lh WHERE wp.location_id=lh.location_id';
/**拼接SQL语句的字符串,注意,这里用SET 和 @ 一定要用@**/
IF(country<>'')
THEN
SET @tempsql=CONCAT(@tempsql,' and wp.country = ''',@country,'''');
END IF;
IF(type<>'')
THEN
SET @tempsql=CONCAT(@tempsql,' and lh.type=''',@type,'''');
END IF;
IF(_year<>'')
THEN
IF(_year<>0)
THEN
SET @tempsql=CONCAT(@tempsql,' and year(lh.starttime)=',@_year,' and year(lh.endtime)=',@_year);
END IF;
END IF;
/**这里可以写上select * from @tempsql 来检查你的SQL拼接是否正确,运行时把它注释就好。但是如果字符串太长的话,可能就看不到了**/
prepare stmt from @tempsql;/**预编译SQL**/
EXECUTE stmt;/**执行SQL**/
END
输入参数设置:
IN `country` varchar(50),IN `type` varchar(255),IN `_year` int
/**注意varchar类型的数据一定要设置大小**/
那么Java调用是这样的:
call(String sql,Object...args){
java.sql.CallableStatement call = connection.prepareCall(sql);//调用准备
if (args!=null) {
for (int i = 0; i < args.length; i++) {
call.setObject(i+1, args[i]);//设置参数
}
}
}
//调用该方法:
call("{call selectHolidayByNameYearCountry(?,?,?)}"
MySQL存储过程动态SQL语句的生成的更多相关文章
- mysql创建存储过程动态SQL语句
DROP PROCEDURE IF EXISTS x.`wk`; DELIMITER $$ CREATE PROCEDURE `x`.`wk`() BEGIN ); ); SET t = CONCAT ...
- oracle 存储过程 动态sql语句
一.在oracle项目开发中越到问题: 在利用ODP向oracle中插入数据时,如果这样写: insert into clobTable (id, story) values(1,'....'); ...
- MySQL基础----动态SQL语句
尊重原创:http://blog.csdn.net/abc19900828/article/details/39501643 动态sql语句基本语法 1 :普通SQL语句可以用Exec执行 eg: ...
- mysql 存储过程 动态sql例子
proc:BEGIN ; ; ; ) DEFAULT ''; ) DEFAULT ''; ) DEFAULT '';#插入日志的表,一个活动一张表 #将局部变量转换成会话变量 #动态sql语言只接受会 ...
- MySQL 存储过程常用SQL语句收集
1,select curdate() /*2016-10-08*/ 2,select date_sub(curdate(), INTERVAL 6 DAY) /*2016-10-02*/ 3,case ...
- 动态SQL语句:定义(一)
文章系列 动态SQL语句:定义(一) 静态SQL与动态SQL 静态SQL:程序运行前,具有固定的形式和结构的SQL. 动态SQL:程序运行时,能够动态改变形式或结构的SQL. 一些思考和想法 在实际的 ...
- mysql 存储过程中使用动态sql语句
Mysql 5.0 以后,支持了动态sql语句,我们可以通过传递不同的参数得到我们想要的值 这里介绍两种在存储过程中的动态sql: set sql = (预处理的sql语句,可以是用concat拼接的 ...
- 存储过程中执行动态Sql语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
- Mysql动态sql语句,用当前时间做表名
在mysql备份操作中, 我们可能要使用表名和当前时间来做为备份表的名称,但是MySQL在存储过程中不支持使用变量名来做表名或者列名. 例如:有一个表"user",我需要备份一份, ...
随机推荐
- jsp重定向和转发
表单提交到servlet后,servlet进行转发之后浏览器上的url为什么还是servlet的url-pattern,但是页面内容却是跳转之后页面的内容. 研究了半天之后发现这个和转发和重定向有关系 ...
- git的详细说明文档
http://www.ihref.com/read-16369.html fork 后如何保持同步 http://www.tuicool.com/articles/6vayqen git clone ...
- Zabbix监控mysql performance
介绍 zabbix监控mysql性能,使用zabbix自带的mysql监控模板,可以监控以下内容OPS(增删改查).mysql慢查询数量.mysql请求\响应流量带宽 配置 新建mysql监控用户 G ...
- iOS - drawRect致内存增加
GPU VS CPU iOS - 软件绘图 自定义"斑马线背景"View,重写drawRect绘制斑马线: ⚠️ 仅仅添加这一个View,内存就比正常增加了3-5M之间. 测试源代 ...
- AnjularJS系列2 —— 表单控件功能相关指令
第二篇,表单控件功能相关指令. ng-checked控制radio和checkbox的选中状态 ng-selected控制下拉框的选中状态 ng-disabled控制失效状态 ng-multiple控 ...
- initialization & finalization
Delphi 的pas文件中可以有initialization和finalization两个关键字, 1.initialization关键字: 在initialization关键字到finalizat ...
- Spring--多人开发
在spring中, 可以定义多个配置文件. 例子: ①首先定义一个班级类和一个学生类 1 package com.fuwh.spring; } } ...
- 【ASP.NET程序员福利】打造一款人见人爱的ORM(二)
上一篇我已经给大家介绍AntORM的框架[ASP.NET程序员福利]打造一款人见人爱的ORM(一),今天就来着重介绍一下如何使用这套框架 1>AntORM 所有成员 如果你只想操作一种数据库,可 ...
- 轮播插件unsilder 源码解析(二)
$.fn._active = function(className) { //当前的添加class,相邻元素去除class return this.addClass(className).siblin ...
- 第一章 Part 1/2 Git 一览
虽然这个系列的文章主要关注的是Github,然而首先了解下Git的基本概念和名词也是非常有帮助的. 工作目录(Working Directory) 工作目录是你个人计算机上的一个目录.在该目录下,每一 ...