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

在运行时从数据类型oracle检测数据类型java,java,oracle,types,metadata,Java,Oracle,Types,Metadata,通过使用JAVA编程语言,我想将ORACLE表中使用的所有数据类型打印到控制台,并转换为其等效的JAVA数据类型;你能帮我吗 例如: Create table Student ( STD_ID number (8) primary Key, NAME varchar2 (15) not null, AGE number (2), AVERAGE number (2, 3) ); 运行程序后,输出类似于以下内容: 整数 串 短 双重的 我通过下面的代码到达orac

通过使用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数据类型,但要将数字数据类型转换为整数、双精度、短型和其他数字数据类型;我有个问题

    结果集.getMetaData.getColumnType(columnCount)


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

    • 如果getScale()>0:double
    • 如果getPrecision()>某个值:short
    • 如果getPrecision()介于某个值和另一个值之间:integer
    • 如果getPrecision()>其他值:long
    在运行时从数据类型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
    
    请参阅

    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
    
      • 返回Java类的完全限定名,如果调用方法ResultSet.getObject从列中检索值,则会生成其实例
    为什么上表中数字字段的输出显示
    java.math.BigDecimal

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

    :

    NUMBER
    类提供Oracle
    NUMBER
    lnxnum\u t
    )数据类型和Java类型之间的转换
    byte[]、byte、short、integer、long、float、double、String、BigInteger
    BigDecimal

    :

    类型映射将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)
    之类的调用。您可能需要显式处理返回数值的精度和比例部分

    请参阅

    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
    

  • 请仔细看答案3。为什么上表中数字字段的输出显示java.math.BigDecimal?你应该把它添加到你的帖子中,而不是添加答案。这个答案看起来像一个问题,但不是答案。最好把它添加到你的问题中。@user3184842:我在这里添加了关于这个新问题的另一个答案。请检查。亲爱的@user3184842,你能给你的答案添加链接吗?@user3184842:在这篇帖子上,一个。