You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:05:37