mod=viewthread&tid=3039" target="_blank">Java拼接动态SQL的一般做法有

      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语句的更多相关文章

  1. Java下拼接执行动态SQL语句(转)

    在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.cs ...

  2. MySQL 动态sql语句运行 用时间做表名

    1. 描写叙述 在使用数据的时候,我时候我们须要非常多数据库,并且想用时间来做表名以区分.可是MySQL在存储过程中不支持使用变量名来做表名或者列名. 比方,有一个表我们想以"2015-07 ...

  3. MySQL存储过程动态SQL语句的生成

    用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...

  4. MyBatis学习(三)、动态SQL语句

    三.动态SQL语句 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Orac ...

  5. 三、动态SQL语句

    //备注:该博客引自:http://limingnihao.iteye.com/blog/106076 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空, ...

  6. 存储过程中执行动态Sql语句

    MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...

  7. Oracle基础 动态SQL语句

    一.静态SQL和动态SQL的概念. 1.静态SQL 静态SQL是我们常用的使用SQL语句的方式,就是编写PL/SQL时,SQL语句已经编写好了.因为静态SQL是在编写程序时就确定了,我们只能使用SQL ...

  8. MyBatis学习 之 三、动态SQL语句

    目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...

  9. 怎样SQL存储过程中执行动态SQL语句

    MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...

随机推荐

  1. 1521. War Games 2(线段树解约瑟夫)

    1521 根据区间和 来确定第k个数在哪 #include <iostream> #include<cstdio> #include<cstring> #inclu ...

  2. poj 2195 Going Home(最小费用最大流)

    题目:http://poj.org/problem?id=2195 有若干个人和若干个房子在一个给定网格中,每人走一个都要一定花费,每个房子只能容纳一人,现要求让所有人进入房子,且总花费最小. 构造一 ...

  3. poj 3080 Blue Jeans(水题 暴搜)

    题目:http://poj.org/problem?id=3080 水题,暴搜 #include <iostream> #include<cstdio> #include< ...

  4. mysql运算符的优先级

    Operator precedences are shown in the following list, from highest precedence to the lowest. Operato ...

  5. iOS--跳转到APPstore评分

    本代码适用于iOS7之后的版本: NSString *str = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/app/ ...

  6. A Fast Priority Queue Implementation of the Dijkstra Shortest Path Algorithm

    http://www.codeproject.com/Articles/24816/A-Fast-Priority-Queue-Implementation-of-the-Dijkst http:// ...

  7. Android中Bitmap和Drawable,等相关内容

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  8. HDU 5965 Gym Class 贪心+toposort

    分析:就是给一些拓补关系,然后求最大分数,所以贪心,大的越靠前越好,小的越靠后越好 剩下的就是toposort,当然由于贪心,所以使用优先队列 #include <iostream> #i ...

  9. 开源了一个iOS输入控件【原】

    1.Github 地址:https://github.com/linyc/InputBarFollowKeyboard 2.说明文档:https://github.com/linyc/InputBar ...

  10. 绕过CDN查找网站真实IP方法

    查找网站 源IP方法: 如果遇到需要绕过CDN,查找网站真实IP地址时,可以采用如下方法: 假设主站服务和邮件服务在同一台服务器: 1.在网站用QQ邮箱注册账号: 2.收取注册验证邮件: 3.查看邮件 ...