Oracle与Java:使用AS别名时从元数据获取原始列名
解决方法
核心问题出在你使用了rsmd.getColumnLabel(i),这个方法会返回SQL语句中定义的列别名(比如TEST、TEST1),而要获取原始表的列名,应该替换为rsmd.getColumnName(i)方法。
修改后的代码
只需要修改循环中获取列名的那一行:
// 原代码 String columnName = rsmd.getColumnLabel( i ); // 修改为 String columnName = rsmd.getColumnName( i );
完整修改后的Java代码如下:
PreparedStatement ps = connection.prepareStatement("SELECT DISTINCT USERNAME AS TEST, SEC_OBJ_CODE AS TEST1 ,SEC_OBJ_MEMBER_VAL, DML_MODE FROM SEC_SECURE_BY_OBJ_MEMBER_USER_TMP"); ResultSet rs = ps.executeQuery(); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); String tableName = null; StringBuilder sb = new StringBuilder( 1024 ); if ( columnCount > 0 ) { sb.append( "Create table " ).append("ML_TEMP").append( rsmd.getTableName( 1 ) ).append( " ( " ); } // for columns for ( int i = 1; i <= columnCount; i ++ ) { if ( i > 1 ) sb.append( ", " ); // 替换为getColumnName获取原始列名 String columnName = rsmd.getColumnName( 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( " )" ); } } sb.append( " )" ); System.out.println( sb.toString() );
原理说明
getColumnLabel():返回SQL查询中指定的列别名(如果有定义),也就是你写的AS TEST里的TEST。getColumnName():返回数据库表中实际的原始列名,不受查询别名影响。
修改后生成的CREATE TABLE语句就会使用USERNAME、SEC_OBJ_CODE这些原始列名,完全符合你的期望输出。
内容的提问来源于stack exchange,提问作者Harish Dalmia
相关产品推荐
相关产品推荐

