在groovy.sql中确定Oracle查询结果的数据类型

时间:2015-12-30 21:00:54

标签: java groovy

在开始处理这些列之前,有没有办法确定查询结果中各列的数据类型?

import groovy.sql.*

rdb = Sql.newInstance('jdbc:oracle:thin:@(conn)',
                      'usr',
                      'pwd','oracle.jdbc.driver.OracleDriver')

String query = '''select * from sample_data'''

// Need to know data types of columns here so I can prepare
// for the row processing

rdb.eachRow(query) {
    // do something with each row 
}

rdb.close()

我正在考虑查询Oracle数据字典,但如果你有通用查询,这不是最好的方法 - 我必须先从查询中创建一些表。

1 个答案:

答案 0 :(得分:4)

要从查询结果集中获取SQL类型,您需要结果集ResultSetMetaData。幸运的是,Groovy Sql提供了一种获取它的方法。这有点奇怪,但它确实有效:

def columnTypes = [:]
def metaClosure = { metaData ->
    /* I'm called once by Sql.eachRow() with a ResultSetMetaData. */
    columnTypes = (1..metaData.columnCount).collectEntries { 
            [(metaData.getColumnName(it)): metaData.getColumnType(it)] 
        }
}

rdb.eachRow('SELECT * FROM person', metaClosure) { row ->
    /* 
     * The result set SQL types and row values are available here.
     * Examples:
     * def value = row['column_name']
     * def type = columnTypes['column_name']
     */
}

在我的示例中,我使用列名作为键,但可能(并且更可靠)使用列索引。返回的SQL类型是java.sql.Types中的类型。