2017-05-11 67 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

相關問題