如何基于JDBC结果集创建表(How to create table based on JDBC R

2019-06-25 22:37发布

我建立一个报告工具,我需要在远程数据库执行查询并存储在自己的数据库中的结果集(因为我没有对远程数据库的写入权限,也是我需要缓存的结果,以防止进一步执行)。 此外,我需要这种能力,所以我可以加入两个结果集在一起,并基于生成的结果的结果。

现在,我的问题是,我不知道如何基于JDBC结果到CREATE TABLE。 是否有处理这个任何开源工具或脚本?

我的应用程序是基于Spring 3.1.0和使用JDBC来查询本地和远程数据库。 我说我要存储结果的本地数据库为MySQL 5.5.20。 (这是一个好主意,在MySQL存储?它是否提供了足够的性能?)

Answer 1:

我们可以提取从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:

我该怎么处理,只有在一个数据库中,而在另一个不存在的类型

目前,只在客户端应用一个结果取决于当你无法做任何事情。
应该永远是从像复合数据类型来选择适当的数据的主要选择查询 geometryaddress ,等。
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:
一个结果可能会在使用关系的多个表的组合产生。 还有一个是,结果集字段组成的表达及其别名的机会。 因此,所得到的列字段或别名的数据类型决定的动态。 元数据是不知道的表,列名和它们原来的/父数据类型从查询的确切名称。

因此, 它是不可能得到

  1. 表的单一名称,并使用它。
  2. 父列的数据类型和使用它。

注意 :这也适用于其他所有跨数据库特定的数据类型,如NVARCHAR等。但是,请参阅本发布了在MySQL替代NVARCHAR使用 。

尝试这样的动态数据迁移之前,它应该是客户端应用程序有责任知道的等效数据类型,并相应地使用它们。

同时,请参阅数据类型和为Microsoft Access,MySQL的范围和SQL Server的更多信息。



Answer 2:

也许这是一个有点棘手,但我认为它可以帮助你。

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。 在此之后,剩下的工作就是填充表。

希望这可以帮助你。



Answer 3:

你可能有基于选择query.Now而不是得到的结果集,然后遍历通过它来创建表,我们也可以执行对表创建一个查询的执行的结果集。

您原来的查询:

select * from table_name

相反,在执行此并遍历的,执行该

create table new_table_name as (select * from table_name)



Answer 4:

作为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;


Answer 5:

如果你想有一个通用的解决方案来处理,在Java中的数据库,但同一类型之间的不同类型的数据,你可以使用的jdbcType。 就拿雷文德·雷迪的解决方案,并改变这一行:

String columnType = rsmd.getColumnTypeName( i );

String columnType = JDBCType.valueOf(rsmd.getColumnType(i)).getName();

希望能帮助到你。



文章来源: How to create table based on JDBC Result Set