我建立一个报告工具,我需要在远程数据库执行查询并存储在自己的数据库中的结果集(因为我没有对远程数据库的写入权限,也是我需要缓存的结果,以防止进一步执行)。 此外,我需要这种能力,所以我可以加入两个结果集在一起,并基于生成的结果的结果。
现在,我的问题是,我不知道如何基于JDBC结果到CREATE TABLE。 是否有处理这个任何开源工具或脚本?
我的应用程序是基于Spring 3.1.0和使用JDBC来查询本地和远程数据库。 我说我要存储结果的本地数据库为MySQL 5.5.20。 (这是一个好主意,在MySQL存储?它是否提供了足够的性能?)
我们可以提取从ResultSet 最近的匹配结构,构建一个表。
但是, 这不可能是精确的复制品,在表名,钥匙,发动机类型而言,一个字段是否为空或不,等等 。
下面的代码片段可以帮助你的方式来获得相应的结果进行。
String sql = "select * from visitors";
ResultSet rs = stmt.executeQuery( sql );
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
String tableName = null;
StringBuilder sb = new StringBuilder( 1024 );
if ( columnCount > 0 ) {
sb.append( "Create table " ).append( rsmd.getTableName( 1 ) ).append( " ( " );
}
for ( int i = 1; i <= columnCount; i ++ ) {
if ( i > 1 ) sb.append( ", " );
String columnName = rsmd.getColumnLabel( i );
String columnType = rsmd.getColumnTypeName( i );
sb.append( columnName ).append( " " ).append( columnType );
int precision = rsmd.getPrecision( i );
if ( precision != 0 ) {
sb.append( "( " ).append( precision ).append( " )" );
}
} // for columns
sb.append( " ) " );
System.out.println( sb.toString() );
与代码的上述部分执行,打印以下字符串:
Create table visitors ( ip VARCHAR( 6 ), bro VARCHAR( 6 ) )
让我希望这可以帮助你进一步进行。
类似的例子可以在这里找到: 创建使用的ResultSet表???
更新1:
我该怎么处理,只有在一个数据库中,而在另一个不存在的类型
目前,只在客户端应用一个结果取决于当你无法做任何事情。
应该永远是从像复合数据类型来选择适当的数据的主要选择查询 geometry
, address
,等。
Examle: select addess.city, address.zipcode, x( geometry_column ), y( geometry_column )
为了给出的示例geometry
数据类型 :
MySQL有其定义空间支持 。 但我不知道他们是多么远好相比, SQL Server的实现空间数据 。
geometry
是复合数据类型,并且因此不能直接查询检索。
你需要依赖的功能(S),从这样的数据列并返回可读的 , 可识别的数据格式解析数据。
例如 : create table geom ( g geometry );
从转换结果集select g from geom
用JAVA create table语句将导致具有一个unknwon
对列的数据类型g
。
Create table geom ( g UNKNOWN )
使用x(g)
, y(g)
上柱坐标函数g
将返回适当的和可接受的数据类型。
查询select x(g), y(g) from geom
将被转换为
Create table ( x(g) DOUBLE( 23, 31 ), y(g) DOUBLE( 23, 31 ) )
更新2:
一个结果可能会在使用关系的多个表的组合产生。 还有一个是,结果集字段组成的表达及其别名的机会。 因此,所得到的列字段或别名的数据类型决定的动态。 元数据是不知道的表,列名和它们原来的/父数据类型从查询的确切名称。
因此, 它是不可能得到
- 表的单一名称,并使用它。
- 父列的数据类型和使用它。
注意 :这也适用于其他所有跨数据库特定的数据类型,如NVARCHAR等。但是,请参阅本发布了在MySQL替代NVARCHAR使用 。
尝试这样的动态数据迁移之前,它应该是客户端应用程序有责任知道的等效数据类型,并相应地使用它们。
同时,请参阅数据类型和为Microsoft Access,MySQL的范围和SQL Server的更多信息。
也许这是一个有点棘手,但我认为它可以帮助你。
JDBC结果对象具有getMetaData()
返回一个方法ResultSetMetaData
包含,除了别的以外,列名和列类型对象。 你可以这样做:
ResultSet rs;
String strSQL;
...
strSQL = "create table tbl ("
for(i=0;i<rs.getMetaData().getColumnCount(),i++) {
if(i>0)
strSQL += ", "
strSQL += rs.getMetaData().getColumnName(i)
+ " "
+ rs.getMetaData().getColumnType(i);
}
strSQL+= ")"
....
您可以构建这种方式,有你需要的列有效的SQL DML。 在此之后,剩下的工作就是填充表。
希望这可以帮助你。
你可能有基于选择query.Now而不是得到的结果集,然后遍历通过它来创建表,我们也可以执行对表创建一个查询的执行的结果集。
您原来的查询:
select * from table_name
相反,在执行此并遍历的,执行该
create table new_table_name as (select * from table_name)
作为sepcified 在这里 ,你能做到这一点的,像这样普通的SQL:
CREATE TABLE artists_and_works
SELECT artist.name, COUNT(work.artist_id) AS number_of_works
FROM artist LEFT JOIN work ON artist.id = work.artist_id
GROUP BY artist.id;
如果你想有一个通用的解决方案来处理,在Java中的数据库,但同一类型之间的不同类型的数据,你可以使用的jdbcType。 就拿雷文德·雷迪的解决方案,并改变这一行:
String columnType = rsmd.getColumnTypeName( i );
至
String columnType = JDBCType.valueOf(rsmd.getColumnType(i)).getName();
希望能帮助到你。