我正在构建一个报告工具,我需要在远程数据库上执行查询并将结果集存储在我自己的数据库中(因为我对远程数据库没有写权限,而且我还需要缓存结果以防止进一步的执行)。此外,我需要这种能力,因此我可以将两个结果集连接在一起,并根据生成的结果生成结果。
现在的问题是,我不知道如何基于jdbc ResultSet创建表。是否有任何开放源码工具或脚本来处理此问题?
我的应用程序基于Spring3.1.0,使用JDBC查询本地和远程数据库。我想存储结果的本地数据库是MySQL 5.5.20。(这是存放在MySQL的好主意吗?它能提供足够的性能吗?)
发布于 2012-06-29 20:43:14
我们可以从结果集中提取最近的匹配结构,并构造一个表。
但是--这不可能是精确的副本,从表名、键、引擎类型、字段是否为空等方面来看,都是。
下面的代码片段帮助您以一种方式获得适当的结果。
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 ) )我希望这能帮助你继续前进。
类似的例子可以在:http://www.coderanch.com/t/295484/JDBC/java/Create-table-ResultSet中找到
更新1:
如何处理只存在于一个数据库而不存在于另一个数据库中的类型?
如果仅依赖客户端应用程序中的结果集,则无法执行任何操作。
它应该始终是从组合数据类型(如geometry、address等)中选择合适数据的主要选择查询。
Examle:select addess.city, address.zipcode, x( geometry_column ), y( geometry_column )
给出一个geometry 数据类型的例子
MySQL有它的http://dev.mysql.com/doc/refman/5.6/en/gis-introduction.html的定义。但我不确定它们与http://msdn.microsoft.com/en-us/library/bb933790相比有多好。
geometry是一种复合数据类型,因此不能通过直接查询检索。
您需要依赖函数来解析这些数据列中的数据,并以可读的、可识别的数据格式返回。
示例:create table geom ( g geometry );
使用ResultSet将select g from geom转换为create语句将产生列g的unknwon数据类型。
Create table geom ( g UNKNOWN )使用x(g),列g上的y(g)协调函数将返回正确和可接受的数据类型.
查询select x(g), y(g) from geom将转换为
Create table ( x(g) DOUBLE( 23, 31 ), y(g) DOUBLE( 23, 31 ) ) 更新2
可以使用关系组合多个表生成结果集。结果集字段也有可能由表达式及其别名组成。因此,结果列字段或别名的数据类型是动态的。元数据不知道查询中表、列名及其原始/父数据类型的确切名称。
所以,我们不可能
备注:这也适用于所有其他跨数据库特定数据类型,如NVARCHAR等。但是,请参考这篇文章是关于在MySQL中使用NVARCHAR的替代方法。。
在尝试这种动态数据迁移之前,客户端应用程序应该负责了解等效的数据类型并相应地使用它们。
此外,有关更多信息,请参考http://www.w3schools.com/sql/sql_datatypes.asp?output=print。
发布于 2012-06-29 20:50:33
也许这有点棘手,但我认为这可能对你有帮助。
JDBC ResultSet对象有一个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。在此之后,剩下的就是填充表。
希望这能帮到你。
发布于 2013-09-18 09:02:50
您可能有一个基于select query.Now的执行的query.Now,而不是获取ResultSet,然后迭代它来创建表,我们还可以执行一个表创建的查询。
您的原始查询:
select * from table_name
而不是执行这个和迭代,执行以下
create table new_table_name as (select * from table_name)
https://stackoverflow.com/questions/11268057
复制相似问题