代码之家  ›  专栏  ›  技术社区  ›  Mirvnillith

为什么JDBC中的数字列的比例和/或精度从Oracle 10到11会有所不同?

  •  7
  • Mirvnillith  · 技术社区  · 16 年前

    对于我们的数据库开发,我们一方面有一个完整的模式DDL脚本,用于临时安装,另一方面有一组连续的“增量”脚本,用于升级(每个脚本都记录在一个特殊的数据库表中是否执行)。

    为了测试这一点,我们有一个ant目标,它安装一个旧版本,升级它,并将模式与新创建的模式进行比较。我们使用JDBC元数据来比较模式,与Oracle 10相比,这非常有效。

    Table <table X> has column <column A> as NUMBER(1,0) NOT NULL in <new schema>, but as NUMBER(0,0) NOT NULL in <upgraded schema>
    Table <table Y> has column <column B> as NUMBER(0,-127) NOT NULL in <new schema>, but as NUMBER(0,0) NOT NULL in <upgraded schema>
    

    看起来差不多(-127现在不是一个很好的比例,是吗)好吧,如果我们做错了什么。但之前使用的文件非常相同,下面是脚本语句:

    CREATE TABLE <table X> ( 
    ...
    <column B> NUMBER(1) DEFAULT 0 NOT NULL,
    ...
    ) 
    
    CREATE TABLE <table Y> ( 
    ...
    <column B> NUMBER DEFAULT 1 NOT NULL,
    ...
    ) 
    

    增量脚本:

    ALTER TABLE <table X> ADD (
    <column A> NUMBER(1) DEFAULT 0 NOT NULL
    )
    
    ALTER TABLE <table Y> ADD (<column B> NUMBER DEFAULT 1 NOT NULL)
    

    下面是JDBC元数据代码:

    public class Column {
    
    String name;
    
    int scale;
    
    int precision;
    
    boolean nullable;
    
    String type;
    
    public Column(ResultSetMetaData metaData, int column) throws SQLException {
        name = metaData.getColumnName(column);
        type = metaData.getColumnTypeName(column);
        scale = metaData.getScale(column);
        precision = metaData.getPrecision(column);
        nullable = metaData.isNullable(column) == ResultSetMetaData.columnNullable;
    }
    
    @Override
    public String toString() {
        return type + "(" + precision + "," + scale + ") "
                + (nullable ? "NULL" : "NOT NULL");
    }
    }
    

    我已经调试了这段代码,据我所知,Oracle JDBC驱动程序在内部“描述”表以生成元数据时会获取这些值。

    请注意,这两个模式都位于同一个数据库实例中,JDBC连接都由同一个JDBC库进行。使用较旧的ojdbc14.jar时也会产生相同的差异,但在Oracle 10中从未出现过这种差异。

    1 回复  |  直到 16 年前
        1
  •  1
  •   No AI now No AI ever    16 年前

    我投票赞成它是ojdbc驱动程序中的一个bug。也就是说,我可能会打电话给 DBMS_METADATA 用于提取DDL的包。这个 ResultSetMetaData 似乎更侧重于确定结果集中的类型,而不是确定数据库对象本身的元数据。