首页 文章

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

提问于
浏览
0

使用 JAVA 编程语言,我想打印到控制台,所有在 ORACLE 表中使用的数据类型为其等效的JAVA数据类型;你能帮我吗?

例如:

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

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

  • 整数

  • 字符串

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

resultset.getMetaData.getColumnType(columnCount);

3 回答

  • 0

    为什么输出数字字段,如上表所示,显示java.math.BigDecimal?

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

    NUMBER

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

    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返回类型的示例 . 我在此帖子上的回答中提供了类似的例子 .

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

    Refer to

  • 1

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

    • 如果getScale()> 0:double

    • 如果getPrecision()>某个值:short

    • 如果getPrecision()介于某个值和其他一些值之间:整数

    • 如果getPrecision()>其他一些值:long .

  • 0

    在运行时从Data Type oracle中检测数据类型java . 我想打印到控制台,所有在ORACLE表中使用的数据类型与其等效的JAVA数据类型

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

    Example

    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
    

    Output Example :类似于:

    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
    

    Refer to

相关问题