Java下拼接运行动态SQL语句
mod=viewthread&tid=3039" target="_blank">Java
1、使用动态语句
非常多数据库都提供了处理动态SQL的语法,如Oracle的EXECUTE IMMEDIATE语句、MSSQL的EXEC和SP_EXECUTESQL、Mysql的预处理语句等。
这些功能让我们在数据库端来处理动态查询提供了极大遍历,但这样的方式仅仅适用于相对简单地动态查询,复杂的情况常常会採用以下的方式。
2、使用存储过程
对于复杂的情况,通常会在存储过程中来拼接动态SQL。使用存储过程完毕相对灵活,但编码复杂度过高,有时执行效率较低。
3、使用其它(如JAVA)程序
使用外部的其它高级语言(如JAVA)拼接后再交由数据库运行也是一种选择,其灵活性较高,但因为JAVA缺乏对集合计算的支持。完毕这些准备工作并不轻松。
假设须要运行动态SQL的主控程序是JAVA的,那么能够使用集算器来协助完毕动态SQL类计算,集算器是动态解释运行的脚本,能够方便地拼出动态SQL运行。集算器提供了JDBC接口,能够置于Java应用程序与数据库之间,让应用程序继续象訪问数据库一样运行集算器脚本,应用结构差点儿不用改变。
以下通过样例来说明怎样使用集算器完毕动态SQL类计算,并集成进JAVA程序。
拼接动态SQL
在集算器中完毕动态SQL拼接,并将拼接后的SQL再交由数据库运行,以查询出目标结果。集算器在完毕时并不涉及目标计算,仅仅拼接动态SQL。如以下的需求:
參数source和target代表两个结构同样但数据不同的表,但表结构未知。
要求以主键为标准用source更新target,比方table1和table2的主键都是A和B,数据例如以下:
用table2更新table1时,MERGE语句应当例如以下:
MERGE INTO table1 as t
USING table2 as s
ON t.A=s.A and t.B=s.B
WHEN MATCHED
THEN UPDATE SET t.C=s.C,t.D=s.D
WHEN NOT MATCHED
THEN INSERT VALUES(s.A,s.B,s.C,s.D)
实现脚本:
A1,A2: 从系统表中读出表source的主键存入变量pks,计算结果为集合["A","B"]。各种数据库获得主键的方法不同。这里以MSSQL为例。
A3,A4:读出source的完整字段,columns的计算结果为["A","B","C","D"]。
A5:动态生成MERGE语句。
pks.(…)是循环函数。可对集合(包含结果集)的成员依次计算,计算中可用~引用循环变量。用#引用循环计数。
A6:运行MERGE语句。
因为表结构未知。用存储过程或JAVA获得表结构再动态拼出SQL很麻烦。使用集合类计算支持良好的集算器来做。代码简单。脚本通用。易于维护。
集算脚本的计算结果能够作为报表数据源供报表使用,还能够在JAVA程序中通过JDBC的方式读取并使用,JAVA读取调用集算脚本代码例如以下:
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
//调用集算器脚本(类似存储过程),当中p1是集算脚本的文件名称
st =(com. esproc.jdbc.InternalCStatement)con.prepareCall("call p1()");
st.setObject(1,"table1");
st.setObject(2," table2");
//运行脚本
st.execute();
……
调用集算器脚本和訪问数据库的方法全然一样。熟悉JDBC的程序猿能够非常快掌握。
关于集算器JDBC的部署和调用的更具体信息可參考集算器集成应用之被JAVA调用
。动态表间连接
相对静态的表间连接,动态表间连接事先并不知道要使用的表。如以下的数据查询:
A表
B表
C表
现须要依据A表的TableName获取B表或C表相应ID的Num值。
目标结果:
实现脚本:
A1:运行SQL从A表取数;
A2:先按TableName分组。循环分组拼接动态查询语句。最后把查询结果依照ID排序。
通过集算器的集合计算能力(分组后仍然保存着分组成员供兴许使用),让动态SQL的拼接工作简单化。
特殊格式数据更新
除了动态数据查询,有时还须要进行动态更新,更新的数据常常来源于第三方程序。其格式也多种多样,如JSON格式、XML等。在特殊的业务背景下,有时须要将这些较特殊格式(相对传统的二维表来说)的数据更新到(关系)数据库中。这就须要借助第三方程序完毕,而像JAVA等高级语言存在缺少类库、硬编码困难等问题。这时能够採用集算器来完毕。以下来看一个集算器解析JSON格式文件入库的样例。源数据例如以下:
要求:将上述内容中指定节点,主要是imei的Service列表更新到数据库2张表groups和Services中。
这里的JSON串因为包括多层且非常多层都是动态的(如LIST和SERVICES下的节点数量和名称都不固定),这为解析带来了非常大难度。并且当中属性名部分还包括空格(如MOVISTAR SPAIN)和点号(如Requires.Network)这也大大添加了解析难度,使用JAVA非常难写。
实现脚本:
A1:读入JSON格式文件,结果为带有层次的结果集。
A2-A3:创建存储更新内容的两个空序表;
A4-D10:循环A1,动态解析内容并将解析结果输出到A2、A3目标结果序表中。
A11-A12:运行更新。将A2、A3序表更新到groups和services表中。
Java下拼接运行动态SQL语句的更多相关文章
- Java下拼接执行动态SQL语句(转)
在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.cs ...
- MySQL 动态sql语句运行 用时间做表名
1. 描写叙述 在使用数据的时候,我时候我们须要非常多数据库,并且想用时间来做表名以区分.可是MySQL在存储过程中不支持使用变量名来做表名或者列名. 比方,有一个表我们想以"2015-07 ...
- MySQL存储过程动态SQL语句的生成
用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...
- MyBatis学习(三)、动态SQL语句
三.动态SQL语句 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Orac ...
- 三、动态SQL语句
//备注:该博客引自:http://limingnihao.iteye.com/blog/106076 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空, ...
- 存储过程中执行动态Sql语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
- Oracle基础 动态SQL语句
一.静态SQL和动态SQL的概念. 1.静态SQL 静态SQL是我们常用的使用SQL语句的方式,就是编写PL/SQL时,SQL语句已经编写好了.因为静态SQL是在编写程序时就确定了,我们只能使用SQL ...
- MyBatis学习 之 三、动态SQL语句
目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...
- 怎样SQL存储过程中执行动态SQL语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
随机推荐
- 函数lock_rec_get_nth_bit
/*********************************************************************//** Gets the nth bit of a rec ...
- Dubbo使用解析及远程服务框架
this is a thub here Spring的Remoting框架 阿里巴巴的dubbo框架 RPC,RMI,JMS,Webservice的区别
- NOI2006最大获利
终于搞明白了…… x到y有边意味着选x必须选y,所以才会有闭合子图中一个点的后继一定也在这个闭合子图中. 接下来按照s连正权,负权连t就ok了 type node=record go,next,c:l ...
- 从算法入手讲解如何在SQL Server中实现最优最简
算法是计算机科学中一个重要的研究方向,是解决复杂问题的关键.在计算机世界中,算法无处不在.数据库是存储数据和执行大批量计算的场所,在数据库中使用一些简单的SQL命令,进行存储.查询.统计.以解决现实世 ...
- I.MX6 Android iperf3 porting failed
/***************************************************************************** * I.MX6 Android iperf ...
- 【转】Ubuntu 14.04配置安装java环境和android开发环境(包括真机调试环境)
原文网址:http://my.oschina.net/HalZf/blog/347351 总要记录下过程,不然老是会忘记掉-真老了.-_-! 一.配置安装ubuntu 64位java环境: 1.下载l ...
- 安装ejabberd2并配置MySQL为其数据库
以前用过openfire做为服务器,但是openfire的集群支持不是很好,所以改用Ejabberd,由于它是用Erlang语言开发的,其并发率与分布式的功能都是很强悍的,在此我记录一下我的安装与配置 ...
- 《深入Java虚拟机学习笔记》- 第8章 连接模型
Java虚拟机学习笔记(八)连接模型
- 【JMeter】Jmeter引入第三方jar包
Jmeter做remoteService,里面用到一个实体:clickEntity,是在一个第三方jar包定义的:com.bj58.opt.ad_logparser-0.0.18-SNAPSHOT.j ...
- WAMP下 搭建Zend Framework(Hello World)实例
一.环境搭建 1.下载安装Zend Framework,此步骤不再详细叙述 2.配置php.ini文件 打开php.ini文件,可以找到如下的代码: ; Windows: "\path1;\ ...