2017-05-11 2 views
1

Ich habe ein wirklich seltsames Problem. Grundsätzlich führe ich dieselbe Abfrage gegen 2 Datenbanken aus, die dieselbe Struktur haben und für einige Spalten, in denen Daten in einer der Datenbanken vorhanden sind, den Wert null erhalten.Oracle: Big Select-Anweisung gibt unterschiedliche Ergebnisse auf identische Datenbanken

Ich habe 2 Datenbanken, die die gleiche Struktur haben, aber zu dieser Struktur auf verschiedene Arten gekommen sind (ich werde später erklären). Hier ist die Version.

Oracle Database Enterprise Edition 12c Veröffentlichung 12.1.0.1.0 - 64-Bit-Produktion
PL/SQL Release 12.1.0.1.0 - Produktion
CORE 12.1.0.1.0 Produktion
TNS für Solaris: Version 12.1.0.1 .0 - Produktion
NLSRTL Version 12.1.0.1.0 - Produktion

Hibernate ruft einige Daten aus der Datenbank ab. Ich habe Hibernate als die Ursache des Problems ausgeschlossen, weil durch einige Debug-Tracing, fand ich die beleidigende SQL-Anweisung. Wenn ich die Anweisung in meinen 2 Datenbanken ausführe, erhalte ich 2 verschiedene Ergebnisse.

Diese SELECT-Anweisung hat 17 LEFT OUTER JOINS und wählt 230 Spalten aus. Ich werde das BigSelect-Statement nennen. Und wie gesagt, ich bekomme für einige Spalten, in denen Daten zu einer der Datenbanken vorhanden sind, null.

Jetzt bekommen Sie das. Wenn ich die Anzahl der Spalten auf 137 reduziere, bekomme ich die richtigen Ergebnisse. Wenn es 138 ist, fehlen mir Daten. Wenn es weniger als 137 ist, funktioniert alles gut.

Und natürlich die exakt gleiche Aussage auf meiner anderen Datenbank erhält jedes Mal die richtigen Ergebnisse, egal wie viele Spalten ich auswähle.

Hier ist der Unterschied zwischen den 2 Datenbanken. Wie ich schon sagte, sie sind identisch aufgebaut, was Tabellen, Spalten, Indizes, Constraints usw. betrifft. Aber sie sind auf verschiedene Arten dorthin gekommen.

Wir werden die Datenbank aufrufen, die die falsche Ergebnisse DATABASE A. gibt Und wir werden die Datenbank aufrufen, die korrekte Ergebnisse DATABASE B.

Hier gibt, ist eine Tabelle, die in beiden Datenbanken ist:

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

In DATABASE B wurde diese Tabelle erstellt, indem das genaue create tablescript ausgeführt wurde.

In DATENBANK A wurde die Tabelle zuerst ohne die Spalten 22 bis 27 erstellt, und diese Spalten wurden später zur Tabelle hinzugefügt. Hier sind die Skripte, die ausgeführt worden wären.

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; 

In DATENBANK B werden alle Spalten korrekt ausgewählt, wenn die BigSelect-Anweisung ausgeführt wird. In DATABASE A geben die Spalten 22-26 bei der Ausführung der BigSelect-Anweisung null zurück, obwohl dort Werte vorhanden sind. Beachten Sie, dass COLUMN27 in Ordnung ist, obwohl es später zur Tabelle hinzugefügt wurde. Könnte es etwas mit Char oder Default zu tun haben?

Wir hatten dieses Problem auch mit einer anderen Tabelle. Wir haben diese Tabelle einfach in DATABASE A abgelegt und neu erstellt, wodurch das Problem behoben wurde. Das würde wahrscheinlich auch für diese Tabelle funktionieren, aber wir möchten die Wurzel des Problems finden, damit wir es in Zukunft vermeiden können.

Warum würde es mit 137 Spalten arbeiten, aber nicht 138?Ich habe keine Einschränkungen für die Anzahl der Spalten gefunden, die Sie aus Oracle auswählen können.

Warum unterscheiden sich die Dinge, wenn wir nach der Erstellung Spalten zu einer Datenbank hinzufügen? Warum funktioniert Spalte 22-26 nicht, aber Spalte 27 funktioniert?

Wir haben hier ziemlich viele Ideen. Wir freuen uns über Vorschläge.

Edit: Hier ist ein Teil der großen Select-Anweisung. Ziemlich einfach, nichts zu heikel geht hier von dem, was ich

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

haben Sie Spalten hinzugefügt, während die Daten bereits vorhanden sind? – maSTAShuFu

+0

ich denke, der Standardwert wird nur angewendet, wenn Sie Daten einfügen und nicht beim Hinzufügen der Spalte mit Daten bereits in der Tabelle – maSTAShuFu

+0

@maSTAShuFu Ich habe Inhalte der Tabelle gelöscht und neue Zeilen mit Werten in den Spalten 22 - 27 hinzugefügt und immer noch die Error. – Justin

Antwort

1

sehen Wenn Sie NULL-Werte statt der Standardwert (statt NULLs statt explizit Werte) zu sehen, ich vermute, es ist darauf zurückzuführen, einige seltsame Regeln, die Oracle beim Hinzufügen von Spalten mit Standardwerten verwendet.

Sie haben eine Funktion eingeführt, mit der Sie, wenn Sie eine Spalte mit einer NOT NULL-Einschränkung und einem DEFAULT-Wert hinzufügen, diesen Standard in den Metadaten speichern und nicht auf jeden bereits vorhandenen Datensatz anwenden. Wenn es abgefragt wurde, würde es es aus den Metadaten herausziehen. Es sollte eine DEFAULT_ON_NULL in USER_TAB_COLUMNS sichtbar sein, um dies anzuzeigen.

Wurden diese Spalten zu einem Zeitpunkt mit NOT NULL hinzugefügt, dann wurde NULL gesetzt? (Möglicherweise gelöscht und wieder hinzugefügt)

Wurden die Daten über ein nicht-konventionelles Mittel geladen (z. B. Partitionsaustausch, transportierbarer Tabellenbereich, Datenpumpe)?

Sind die Spalten indiziert (was bedeutet, dass der Wert aus der Indexstruktur oder der zugrunde liegenden Tabelle stammen könnte)?

Gibt es eine Komprimierung? (Der Wert für mehrere Zeilen kommen würde, von einer Stelle für einen Block)

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

PS. Dies muss wirklich zum Oracle Support gehen.

+0

Hallo Gary, ich bekomme NULL anstelle von explizit gesetzten Werten und die Spalten waren nie NOT NULL an irgendeinem Punkt. Ich habe Daten durch einfache Hibernate-Speicher und manuelle Einfügungen einzelner Zeilen in SQL Developer hinzugefügt. – Justin

Verwandte Themen