【问题标题】:Detect data type java from Data Type oracle in run time在运行时从数据类型 oracle 中检测数据类型 java
【发布时间】:2014-03-21 07:22:05
【问题描述】:

使用 JAVA 编程语言,我想将 ORACLE 表中使用的所有数据类型打印到其等效的 JAVA 数据类型;你会帮我吗?

例如:

Create table Student (
    STD_ID number (8) primary Key,
    NAME varchar2 (15) not null,
    AGE number (2),
    AVERAGE number (2, 3)
);

运行程序后,输出类似如下:

  1. 整数
  2. 字符串

我通过以下代码达到oracle数据类型,但是将Number数据类型转换为Integer、Double、Short和其他Numeric数据类型;我有问题。

resultset.getMetaData.getColumnType(columnCount);

【问题讨论】:

    标签: java oracle types metadata


    【解决方案1】:

    为什么上表的数字字段输出显示java.math.BigDecimal

    根据 Oracle 有关数据类型及其 Java 映射的文档:

    NUMBER

    NUMBER 类提供 Oracle Number (lnxnum_t) 数据类型与 Java 类型 byte[], byte, short, integer, long, float, double, String, BigIntegerBigDecimal 之间的转换。

    Understanding Type Maps

    类型映射将 Java 类与 Oracle 对象的 SQL 类型名称相关联。这是一对一的映射,作为键值对存储在哈希表中。当您从 Oracle 对象读取数据时,JDBC 驱动程序会考虑类型映射以确定使用哪个 Java 类来实现来自 SQL 对象类型的数据。当您将数据写入 Oracle 对象时,JDBC 驱动程序通过调用 SQLData 接口的getSQLTypeName() 方法从 Java 类中获取 SQL 类型名称。 SQL 和 Java 之间的实际转换由驱动程序处理。

    这是默认行为,您可以在getObject 方法中找到它基础返回类型。对于NUMBER 的数据类型,返回类型为java.math.BigDecimal

    +-----------------+------------------------+------------------------+
    | Oracle SQL Type | getObject()            | getOracleObject()      |
    |                 | Underlying Return Type | Underlying Return Type |
    +-----------------+------------------------+------------------------+
    | CHAR            | String                 | oracle.sql.CHAR        |
    | VARCHAR2        | String                 | oracle.sql.CHAR        |
    | LONG            | String                 | oracle.sql.CHAR        |
    | NUMBER          | java.math.BigDecimal   | oracle.sql.NUMBER      |
    | RAW             | byte[]                 | oracle.sql.RAW         |
    | LONGRAW         | byte[]                 | oracle.sql.RAW         |
    | DATE            | java.sql.Timestamp     | oracle.sql.DATE        |
    +-----------------+------------------------+------------------------+
    

    了解数据库特定数据类型的 Java 返回类型的示例显示在下面提到的摘要页面上的示例中。我之前对这篇文章的回答中提出了类似的例子。

    结论
    返回类型是特定于数据库驱动程序的。如果您为了方便或出于任何其他原因想强制转换它们,您可以进行显式调用,例如,在 NUMBER 数据类型列上使用 getDouble( columnNumber )。您可能需要明确处理返回数值的精度和比例部分。

    参考

    1. Oracle's Built-in Data Types
    2. Summary of getObject() and getOracleObject() Return Types
    3. Valid SQL Datatype-Java Class Mappings

    【讨论】:

      【解决方案2】:

      一旦你知道你有一个数字列,你就可以用 getPrecision 和 getScale 猜测实际类型:

      • 如果 getScale() > 0: 双倍
      • 如果 getPrecision() > 某个值:短
      • 如果 getPrecision() 介于某个值和某个其他值之间:整数
      • 如果 getPrecision() > 其他值:long。

      【讨论】:

        【解决方案3】:

        在运行时从数据类型 oracle 中检测数据类型 java

        我想打印到控制台,所有在 ORACLE 表中使用的数据类型到它们等效的 JAVA 数据类型

        您可以调用getColumnClassName 来获取任何数据库表列的数据类型的 JAVA 限定类匹配。

        示例

        ResultSetMetaData rsmd = rs.getMetaData();
        int numberOfColumns = rsmd.getColumnCount();
        
        for( int i=1; i <= numberOfColumns; i++ ) {
            // label if defined else name of column
            String columnLabel = rsmd.getColumnLabel( i ); 
        
            // data type in database
            String columnType = rsmd.getColumnTypeName( i ); 
        
            // java equivalent class name
            String columnClassName = rsmd.getColumnClassName( i ); 
        
            System.out.println( "Column Name : " + columnLabel );
            System.out.println( "Column Type : " + columnType );
            System.out.println( "Column Class: " + columnClassName );
        
            System.out.println();
        } // for count of columns
        

        输出示例:类似于:

        Column Name : t
        Column Type : TIMESTAMP
        Column Class: java.sql.Timestamp
        
        Column Name : i
        Column Type : INT
        Column Class: java.lang.Integer
        
        Column Name : d
        Column Type : DATE
        Column Class: java.sql.Date
        
        Column Name : e
        Column Type : CHAR
        Column Class: java.lang.String
        
        Column Name : s
        Column Type : VARCHAR
        Column Class: java.lang.String
        

        参考

        【讨论】:

        • 请仔细看答案3。
        • 为什么上表中数字字段的输出显示 java.math.BigDecimal? 您应该将其添加到您的帖子中,而不是添加答案。这个答案看起来像一个问题,但不是答案。最好将其添加到您的问题中。
        • @user3184842:我在这里添加了关于这个新问题的另一个答案。请检查。
        • 亲爱的@user3184842,您能在答案中添加链接吗?
        • @user3184842:在这个帖子上,second answer from me
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-02
        • 2013-12-10
        • 1970-01-01
        • 2011-03-31
        • 2020-06-17
        相关资源
        最近更新 更多