我试图运行一个连接多个表的查询,然后我想用它从结果集中获取列名详细信息,比如名称等等(无论我能得到什么)。
使用没有连接的查询,我会做类似的事情:
DatabaseMetaData dmd = connection.getMetaData();
try (ResultSet rs = dmd.getColumns(null, null, tableName, null)) {
while (rs.next()) {
String columnName = rs.getString("COLUMN_NAME");
String columnType = rs.getString("TYPE_NAME");
Integer columnLength = rs.getInt("COLUMN_SIZE");
Boolean columnPrimaryKey = false;
ResultSet primaryKeysSet = columnMeta.getPrimaryKeys(null, null, clazz.getSimpleName());
while (primaryKeysSet.next()) {
if (primaryKeysSet.getString(4).equalsIgnoreCase(columnName)) {
columnPrimaryKey = true;
}
}
Boolean columnNotNull = columnResultSet.getString("NULLABLE").equals("0");
}
}
但是,就dmd.getColumns(null, null, tableName, null)
而言,我在获取tableName
时会遇到问题,因为它有多个表格。
有没有办法从包含多个表连接的查询中获取列数据?
答案 0 :(得分:0)
使用相同的原则,但在(加入)查询的ResultSet上调用getMetaData()
。
这里是简化示例 - 您应该使用preparedStatement
很抱歉使用Groovy - 但应该清楚如何传入Java
ResultSet rs = dmd.createStatement().executeQuery('select * from ta, tb') // your join statement here
def rsmd = rs.getMetaData();
def colCount = rsmd.getColumnCount()
println "getColumnCount ${colCount}"
colCount.times {i ->
println "---------------------------------"
println "columnName ${rsmd.getColumnName(i+1)}"
println "columnType ${rsmd.getColumnTypeName(i+1)}"
println "Precision ${rsmd.getPrecision(i+1)}"
println "Scale ${rsmd.getScale(i+1)}"
println "isNullable ${rsmd.isNullable(i+1)}"
// Oracle extension
println "isNCHAR ${rsmd.isNCHAR(i+1)}"
// print column value as String
println rs.getString(i+1)
}