JDBC:从元数据中获取数组的类型

Posted

技术标签:

【中文标题】JDBC:从元数据中获取数组的类型【英文标题】:JDBC : get the type of an array from the metadata 【发布时间】:2017-03-21 14:21:30 【问题描述】:

是否可以从 JDBC 元数据结构中获取数组列的类型?

re = openedConnection.getMetaData().getColumns(...)
while (rs.next())

  final String columnName = rs.getString("COLUMN_NAME");
  final int columnType = rs.getInt("DATA_TYPE");
  ...

type 返回 ARRAY,但返回一个包含什么 (int、text、numeric...) 的数组?

理想情况下独立于数据库(Oracle 和 Postgres 支持这一点,不确定 mysql 或 SQL Server)

【问题讨论】:

rs.getString("TYPE_NAME")docs.oracle.com/javase/8/docs/api/java/sql/… 或者甚至直接从一个ResultSet(例如resultSet.getMetaData().getColumnType(1)。(获取第一列的类型) @dsp_user 你的意思是.getColumnTypeName(1)getColumnType(1) 返回 java 类型(只有 ARRAY)。 不,正如我所写的。代码是 resultSet.executeQuery(); resultSet.getMetaData().getColumnType(1)。 (获取第一列的类型)。您甚至可以使用返回空 ResultSet 的选择(元数据仍然存在) 对不起,我不明白你问什么(但现在我明白了)。请忽略我的评论。 【参考方案1】:

使用java.sql.ResultSetMetaData.getColumnTypeName():

Oracle 设置

CREATE OR REPLACE TYPE random_array IS TABLE OF VARCHAR2(42);
/

Java

Class.forName("oracle.jdbc.OracleDriver");

Connection con = DriverManager.getConnection(
    "jdbc:oracle:thin:@localhost:1521:orcl",
    "username",
    "password"
);

PreparedStatement st = con.prepareStatement(
    "SELECT random_array( 'a', 'b', 'c' ) AS array FROM DUAL"
);

ResultSet rs = st.executeQuery();
while( rs.next() )

  String type = rs.getMetaData().getColumnTypeName(1);
  String[] data = (String[]) rs.getArray(1).getArray();
  System.out.println( type + ": " + Arrays.toString( data ) );


st.close();
con.close();

输出

SCHEMA_NAME.RANDOM_ARRAY: [a, b, c]

如果您想回到 Oracle 并找到您可以使用的集合元素的类型:

SELECT ELEM_TYPE_NAME,
       LENGTH,
       PRECISION,
       SCALE
FROM   ALL_COLL_TYPES
WHERE  TYPE_NAME = 'RANDOM_ARRAY'
AND    OWNER     = 'SCHEMA_NAME';

哪些输出:

ELEM_TYPE_NAME LENGTH PRECISION SCALE
-------------- ------ --------- -----
VARCHAR2           42

【讨论】:

但是 ic3 没有查询他/她可以从哪里获得 ResultSetMetadata

以上是关于JDBC:从元数据中获取数组的类型的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试从元天气 api 获取数据,但它不让我

使用 JAVA 类从元数据 DatabaseMetaData 中获取特定数据库表的外键和引用表名

如何使用 JavaScript 从元标记中获取信息?

BigtableConnection API 失败;从元数据服务器获取访问令牌时出错

如何从元组数组创建字典?

从元数据中提取错误验证消息