需要使用java从sql查询中获取元数据

Posted

技术标签:

【中文标题】需要使用java从sql查询中获取元数据【英文标题】:Need to fetch Metadata from sql query using java 【发布时间】:2015-03-25 11:54:38 【问题描述】:

我有一个 sql 查询,我需要列名和数据类型以及它的表名和模式名:

这是我在 SQLSERVER 上使用和测试它的方法:

public static void getMetadataForConn(Connection conn) throws SQLException
    
        ResultSet rs = null;
         try
         

             Statement stmt = conn.createStatement();
             rs = stmt.executeQuery("SELECT AB_DEMO_SRC.dbo.employee.dept_id dept_id, AB_DEMO_SRC.dbo.employee.email_add email_add, AB_DEMO_SRC.dbo.employee.emp_address emp_address, AB_DEMO_SRC.dbo.employee.emp_id emp_id, AB_DEMO_SRC.dbo.employee.emp_name emp_name FROM AB_DEMO_SRC.dbo.employee ");
             ResultSetMetaData md = rs.getMetaData();
             int columnCount = md.getColumnCount();
             for (int i = 1; i <= columnCount; i++)
                 System.out.print(md.getColumnName(i) + "(" + md.getColumnType(i) + ") "+md.getSchemaName(i)+"."+md.getTableName(i));
             System.out.println();
             while (rs.next())
             
                 for (int i = 1; i <= columnCount; i++)
                 
                     Object o = rs.getObject(i);
                     System.out.print(null == o ? "" : o.toString() + " ");
                 
                 System.out.println();
             
            
            finally
            
                if (null != rs)
                
                    rs.close();
                
            
    

我得到了所有其他元数据详细信息,如数据类型、精度和比例。奇怪的是,我得到的表名和模式名称为“”,它是空白的。有没有其他方法可以获取中存在的列的元数据一个查询?

【问题讨论】:

尝试通过添加 sqljdbc41.jar 以及..其中提到这个 jar 用于 jdk7 和 jre7,并且它实现了 jdbc api 方法.. 我真的不明白为什么相同的方法返回 TableName 和ScehmaName 用于 Teradata 和 DB2,但不适用于 SQL Server 和 Oracle 【参考方案1】:

我认为问题在于ResultSet 的列与任何表都不相关,它们仅与查询相关。查询可能很复杂,可能有计算列等。这就是它们的表名是空白的原因。

如果要获取特定表的列信息,可以使用数据库的元数据:

DatabaseMetaData meta = conn.getMetaData();
ResultSet columns = meta.getColumns(null, "dbo", "employee", null);

【讨论】:

我在代码中提到的方法适用于其他查询,例如来自 Teradata/DB2 的查询,无法指出为什么我没有仅为 SQLSERVER 和 ORACLE 获取 TableName 和模式名称【参考方案2】:

您可以通过调用ResultSet的'getMetaData'方法来获取列名。

ResultSetMetaData metaData= resultSet.getMetaData();
String columnName = metaData.getColumnName(1);

所有其他列元数据也可以使用 ResultSetMetaData 对象获取

【讨论】:

这正是我在代码中提到的,谢谢

以上是关于需要使用java从sql查询中获取元数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 sql server information_schema(元数据)中获取依赖表?

Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

元数据库中的本机和 SQL 查询

从扩展属性中获取元数据 (SQL Server)

Talend Studio - 在元数据中搜索以获取创建的所有查询

第三章 - SQL基础及元数据获取