2017-05-11 68 views
1

我有一个很奇怪的问题。基本上,我对2个结构相同的数据库运行相同的查询,并且在其中一个数据库上有数据的某些列上获得空值。Oracle:Big Select声明在相同的数据库中给出了不同的结果

我有两个结构相同的数据库,但以不同的方式获得了该结构(稍后我会解释)。这是版本。

Oracle数据库12c的企业版发行12.1.0.1.0 - 64位生产
PL/SQL发布12.1.0.1.0 - 生产
CORE 12.1.0.1.0生产
TNS用于Solaris:版本12.1.0.1 .0 - 生产
NLSRTL版本12.1.0.1.0 - 生产

Hibernate正在从数据库检索一些数据。我排除了hibernate作为问题的原因,因为通过一些调试跟踪,我发现了有问题的sql语句。当我在我的2个数据库上运行该语句时,我得到2个不同的结果。

此select语句有17个左外连接并选择230列。我将称之为BigSelect语句。就像我说的,对于其中一个数据库中有数据的某些列,我得到空值。

现在得到它。当我将语句收集到的列数减少到137时,我会得到正确的结果。如果是138,我缺少数据。如果它小于137,一切正常。

当然,无论我选择多少列,我的其他数据库上的完全相同的语句每次都会得到正确的结果。

这是2个数据库之间的区别。就像我所说的那样,它们的表格,列,索引,约束等的结构是一样的。但是他们以不同的方式到达了那里。

我们会打电话,让不正确的结果数据库A.数据库,我们会打电话,让正确的结果数据库B.

这里的数据库是一个表,它是在两个数据库:

create table TABLE3 
(
    COLUMN1 number(10), 
    COLUMN2 number(10) REFERENCES TABLE(COLUMN2) not null, 
    COLUMN3 varchar2 (15) not null, 
    COLUMN4 nvarchar2 (100) not null, 
    COLUMN5 number(10) references TABLE1(COLUMN5) not null, 
    COLUMN6 varchar2 (30), 
    COLUMN7 varchar2(25) not null, 
    COLUMN8 binary_double, 
    COLUMN9 number(10), 
    COLUMN10 number(10), 
    COLUMN11 char(1) default 'N', 
    COLUMN12 number(10) default 2 not null, 
    COLUMN13 number(10) default 1 not null, 
    COLUMN14 number(10) default 1 not null, 
    COLUMN15 number(10) default 7, 
    COLUMN16 number(7,2) default 99999, 
    COLUMN17 number(7,2) default 99999, 
    COLUMN18 number(7,2) default 99999, 
    COLUMN19 number(7,2) default 99999, 
    COLUMN20 number(10) default -1, 
    COLUMN21 number(10) default 1, 
    COLUMN22 char(1) default 'C', 
    COLUMN23 char(1) default 'C', 
    COLUMN24 char(1) default 'N', 
    COLUMN25 char(1) default 'C', 
    COLUMN26 char(1) DEFAULT 'C', 
    COLUMN27 BINARY_DOUBLE, 
    COLUMN28 char(1) default 'Y', 
    primary key (COLUMN1), 
    UNIQUE (COLUMN3,COLUMN2) 
); 

在DATABASE B中,此表是通过运行确切的创建表脚本而创建的。

在数据库A中,该表首先创建而没有列22-27,并且稍后将这些列添加到表中。这是本来可以运行的脚本。

create table TABLE3 
(
    COLUMN1 number(10), 
    COLUMN2 number(10) REFERENCES TABLE(COLUMN2) not null, 
    COLUMN3 varchar2 (15) not null, 
    COLUMN4 nvarchar2 (100) not null, 
    COLUMN5 number(10) references TABLE1(COLUMN5) not null, 
    COLUMN6 varchar2 (30), 
    COLUMN7 varchar2(25) not null, 
    COLUMN8 binary_double, 
    COLUMN9 number(10), 
    COLUMN10 number(10), 
    COLUMN11 char(1) default 'N', 
    COLUMN12 number(10) default 2 not null, 
    COLUMN13 number(10) default 1 not null, 
    COLUMN14 number(10) default 1 not null, 
    COLUMN15 number(10) default 7, 
    COLUMN16 number(7,2) default 99999, 
    COLUMN17 number(7,2) default 99999, 
    COLUMN18 number(7,2) default 99999, 
    COLUMN19 number(7,2) default 99999, 
    COLUMN20 number(10) default -1, 
    COLUMN21 number(10) default 1, 
    COLUMN28 char(1) default 'Y', 
    primary key (COLUMN1), 
    UNIQUE (COLUMN3,COLUMN2) 
); 

alter table TABLE3 add COLUMN22 char(1) default 'C'; 
alter table TABLE3 add COLUMN23 char(1) default 'C'; 
alter table TABLE3 add COLUMN24 char(1) default 'N'; 
alter table TABLE3 add COLUMN25 char(1) default 'C'; 
alter table TABLE3 add COLUMN26 char(1) DEFAULT 'C'; 
alter table TABLE3 add COLUMN27 BINARY_DOUBLE; 

在DATABASE B中,执行BigSelect语句时所有列都被正确选择。在DATABASE A中,当执行BigSelect语句时,即使有值时,第22-26列也会返回null。请注意,COLUMN27即使在稍后添加到表格中也会很好。它可能与char或default有关吗?

我们实际上也有另一个表的这个问题。我们简单地将该表放入数据库A并重新创建它,并解决了问题。这可能也适用于这张桌子,但我们希望找到问题的根源,以便将来避免它。

它为什么会与137列,但不是138?对于可以从Oracle中选择的列数,我没有发现任何限制。

如果我们在创建数据库后向数据库添加列,为什么情况会不同?为什么第22-26列不起作用,但第27列起作用?

这里我们几乎没有想法。我们感谢任何建议。

编辑:这是大选择语句的一部分。很简单,没有什么棘手的事情在这里我可以看到

SELECT table4_1.T4C4    AS T4C4 18_30_15_, 
    table4_1.T4C1       AS T4C115_, 
    table4_1.T4C1       AS T4C131_14_, 
    table4_1.T4C17     AS T4C17_31_14_, 
    table4_1.T4C2     AS T4C2_31_14_, 
    table4_1.T4C3      AS T4C331_14_, 
    table4_1.T4C5    AS T4C5, 
    table4_1.T4C6     AS T4C6, 
    table4_1.T4C7    AS QTY7_31_14_, 
    table4_1.T4C8     AS T4C7, 
    table4_1.T4C9     AS T4C9, 
    table4_1.T4C10     AS T4C10, 
    table4_1.T4C11    AS T4C11, 
    table4_1.T4C12     AS T4C12, 
    table4_1.T4C13    AS T4C13, 
    table4_1.T4C14     AS T4C14, 
    table4_1.COLUMN1        AS COLUMN1, 
    table4_1.T4C4      AS T4C4 T4C4, 
    table4_1.COLUMNA       AS COLUMNA, 
    table4_1.COLUMND    AS COLUMND, 
    table4_1.COLUMNF       AS COLUMNF31_14_, 
    table4_1.T4C15    AS T4C15, 
    table4_1.T4C16    AS T4C16, 
    table3_1.COLUMN1        AS COLUMN120_0_, 
    table3_1.COLUMN28       AS COLUMN2820_0_, 
    table3_1.COLUMN24  AS COLUMN24, 
    table3_1.COLUMN7     AS COLUMN7, 
    table3_1.COLUMN22      AS COLUMN22, 
    table3_1.COLUMN15     AS COLUMN15, 
    table3_1.COLUMN7       AS COLUMN7, 
    table3_1.COLUMN10   AS COLUMN10, 
    table3_1.COLUMN27   AS COLUMN27, 
    table3_1.COLUMN11  AS COLUMN11, 
    table3_1.COLUMN23  AS COLUMN23, 
    table3_1.COLUMN14   AS COLUMN14, 
    table3_1.COLUMN3      AS COLUMN3, 
    table3_1.COLUMN4     AS COLUMN4, 
    table3_1.COLUMN21    AS COLUMN21, 
    table3_1.COLUMN5        AS COLUMN5, 
    table3_1.COLUMN26     AS COLUMN26, 
    table3_1.COLUMN25   AS COLUMN25, 
    table3_1.COLUMN8    AS COLUMN8, 
    table3_1.COLUMN9    AS COLUMN9, 
    table3_1.COLUMN2      AS COLUMN2, 
    table3_1.COLUMN20      AS COLUMN20, 
    table3_1.COLUMN16     AS COLUMN16, 
    table3_1.COLUMN2    AS COLUMN2, 
    table3_1.COLUMN2     AS COLUMN2, 
    table3_1.COLUMN17     AS COLUMN17, 
    table3_1.COLUMN12   AS COLUMN12, 
    table3_1.COLUMN13     AS COLUMN13, 
    table1_1.COLUMN5        AS COLUMN517_1_, 
    .....(230 TOTAL COLUMNS SELECTED)... 
FROM TABLE4 table4_1 
LEFT OUTER JOIN TABLE3 table3_1 
ON table4_1.COLUMN1=table3_1.COLUMN1 
LEFT OUTER JOIN TABLE1 table1_1 
ON table3_1.COLUMN5=table1_1.COLUMN5 
LEFT OUTER JOIN TABLE5 table5_1 
ON table3_1.COLUMN1=table5_1.COLUMN1 
LEFT OUTER JOIN TABLE6 table6_1 
ON table3_1.COLUMN1=table6_1.COLUMN1 
LEFT OUTER JOIN TABLE7 table7_1 
ON table4_1.COLUMNA=table7_1.COLUMNA 
LEFT OUTER JOIN TABLE3 table3_2 
ON table7_1.COLUMN1=table3_2.COLUMN1 
LEFT OUTER JOIN TABLE8 table8_1 
ON table7_1.COLUMNB=table8_1.COLUMNB 
LEFT OUTER JOIN TABLE9 table9_1 
ON table8_1.COLUMNC=table9_1.COLUMNC 
LEFT OUTER JOIN TABLE10 table10_1 
ON table4_1.COLUMND=table10_1.COLUMND 
LEFT OUTER JOIN TABLE11 table11_1 
ON table10_1.COLUMNE=table11_1.COLUMNE 
LEFT OUTER JOIN TABLE12 table12_1 
ON table4_1.COLUMNF=table12_1.COLUMNF 
LEFT OUTER JOIN TABLE3 table_3_3 
ON table12_1.COLUMN1=table_3_3.COLUMN1 
LEFT OUTER JOIN TABLE13 table13_1 
ON table12_1.COLUMNG=table13_1.COLUMNG 
LEFT OUTER JOIN TABLE14 table14_1 
ON table13_1.COLUMNH   =table14_1.COLUMNH 
WHERE table4_1.T4C4=? 
+0

您是否已经添加了列而数据已经存在? – maSTAShuFu

+0

我认为当你插入数据,而不是当数据表中的 – maSTAShuFu

+0

已经添加列@maSTAShuFu我在列与值删除的表的内容,并增加了新的22行的默认值仅适用 - 27仍能获得错误。 – Justin

回答

1

如果您看到了空值,而不是默认值(而不是空值,而不是明确设定值),我怀疑这是由于一些奇怪的Oracle在添加具有默认值的列时使用的规则。

他们推出了设施,是,如果你有一个NOT NULL约束和默认值添加一列,然后它会存储在元数据默认,而不是把它应用到每一个预先存在的记录。当被查询时,它会将其从元数据中提取出来。在USER_TAB_COLUMNS中应该有一个可见的DEFAULT_ON_NULL来表明这一点。加入

一次那些列有NOT NULL,那么可为空? (可能下降,并添加重)

难道得到的数据通过非传统手段(如分区交换,传输表空间,数据泵)装?

是列索引(这意味着该值可能来自索引结构或基础表)?

是否存在压缩? (对于多行的值将来自一个地点的块)

https://www.pythian.com/blog/adding-columns-with-default-values-and-not-null-in-oracle-11g/

PS。这真的需要去Oracle支持。

+0

嗨,加里,我得到空值,而不是明确设置值,并且列在任何时刻都不会不为空。我通过SQL Developer中的简单休眠保存和单行手动插入来添加数据。 – Justin

相关问题