gpt4 book ai didi

oracle - 为什么 Oracle 10 到 11 的 JDBC 中数字列的小数位数和/或精度会有所不同?

转载 作者:行者123 更新时间:2023-12-03 00:07:20 26 4
gpt4 key购买 nike

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

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

现在我们已升级到 Oracle 11 并从 ojdbc14.jar 迁移到 ojdbc6.jar。测试在 Oracle 10 上仍然运行绿色,但在 Oracle 11 上我们得到(两个典型示例):

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 现在不是一个很好的比例)好吧,如果我们做错了什么。但之前的文件完全相同,下面是脚本语句:

DDL 脚本:

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

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

Delta 脚本:

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");
}
}

是的,列索引从 1 开始,它是用于比较不同列的 toString() 值(也在上面的错误输出中使用)。

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

请注意,这两个模式都位于同一个数据库实例中,并且 JDBC 连接都是由同一个 JDBC 库建立的。使用旧版 ojdbc14.jar 时会产生相同的差异,但在 Oracle 10 中则不会。

有人对此有任何意见吗?我陷入了困境,我们无法对数据库升级脚本进行可靠的测试。

最佳答案

我认为这是 ojdbc 驱动程序中的一个错误。也就是说,我可能会调用 DBMS_METADATA 包来提取 DDL。 ResultSetMetaData 似乎更专注于确定结果集中的类型,而不是确定数据库对象本身的元数据。

关于oracle - 为什么 Oracle 10 到 11 的 JDBC 中数字列的小数位数和/或精度会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2133679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com