Ora et labora
Benutzer
- Beiträge
- 6
Hallo,
ich bin neu hier und ich wende mich an Euch, weil ich ein Problem (siehe unten) habe und alleine nicht weiterkomme.
Mein Problem:
Oracle: "SELECT" vs. "INSERT INTO table SELECT" liefern unterschiedliche Tupel.
Istzustand:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
Oracle SQL Developer IDE 17.4.0.355.2349
Kenntnisse in Oracle SQL und Oracle PL/SQL sind (möglicherweise zu wenig) vorhanden.
Ich habe eine PL/SQL-Funktion "getZeit" (mit ca. 700 Zeilen Code) geschrieben, die Fertigungszeiten ermittelt und aufsummiert.
Diese Funktion ruft sich unter Umständen rekursiv auf.
Diese Funktion enthält eine Menge von unserer Firmenlogik, deshalb möchte ich sie hier nicht zeigen.
Diese Funktion enthält den folgenden EXCEPTION-Block.
Wenn ich diese PL/SQL-Funktion "getZeit" in einem SELECT-Statement in der WHERE-Klausel bzw. in der AND-Bedingung (mit oder ohne NVL) nutze, ist alles in Ordnung, d.h. es wird immer die korrekte Anzahl von Tupeln geliefert. Das SELECT-Statement gebe ich hier mal "neutralisiert" und auf das Wesentliche reduziert wieder.
Nutze ich obiges SELECT-Statement (mit der PL/SQL-Funktion "getZeit" in der AND-Bedingung) jedoch in Verbindung mit der "INSERT INTO table ... SELECT ..."-Syntax zum Einfügen mehrerer Datensätze in eine Tabelle, dann werden mehr Datensätze in die Tabelle eingefügt, als es sein sollten. ;-(
Ich habe bereits die PL/SQL-Funktion "getZeit" ausführlich und mehrfach zu Fuß überprüft, debuggt und finde darin keinen Fehler.
Der Fehler:
Was mir aufgefallen ist, dass mit der AND-Bedingung "AND NVL (kontext.getZeit(t1.TeileID), 0) = 0" z.B. 40 Tupel fälschlicherweise in die Tabelle eingefügt werden, hingegen mit der AND-Bedingung "AND kontext.getZeit(t1.TeileID) = 0" richtigerweise keine Tupel in die Tabelle eingefügt werden.
Ich bin jetzt ratlos, wo mein Fehler liegt und hoffe auf Eure hilfreichen Tips, damit ich meinen Fehler korrigieren kann.
ich bin neu hier und ich wende mich an Euch, weil ich ein Problem (siehe unten) habe und alleine nicht weiterkomme.
Mein Problem:
Oracle: "SELECT" vs. "INSERT INTO table SELECT" liefern unterschiedliche Tupel.
Istzustand:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
Oracle SQL Developer IDE 17.4.0.355.2349
Kenntnisse in Oracle SQL und Oracle PL/SQL sind (möglicherweise zu wenig) vorhanden.
Ich habe eine PL/SQL-Funktion "getZeit" (mit ca. 700 Zeilen Code) geschrieben, die Fertigungszeiten ermittelt und aufsummiert.
Diese Funktion ruft sich unter Umständen rekursiv auf.
Diese Funktion enthält eine Menge von unserer Firmenlogik, deshalb möchte ich sie hier nicht zeigen.
Diese Funktion enthält den folgenden EXCEPTION-Block.
Code:
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('NO_DATA_FOUND = ' || '; Fehler = ' || sqlerrm);
RETURN NULL;
WHEN PROGRAM_ERROR THEN
dbms_output.put_line('PROGRAM_ERROR = ' || '; Fehler = ' || sqlerrm);
RETURN NULL;
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line('TOO_MANY_ROWS = ' || '; Fehler = ' || sqlerrm);
RETURN NULL;
WHEN VALUE_ERROR THEN
dbms_output.put_line('VALUE_ERROR = ' || '; Fehler = ' || sqlerrm);
RETURN NULL;
WHEN ZERO_DIVIDE THEN
dbms_output.put_line('ZERO_DIVIDE = ' || '; Fehler = ' || sqlerrm);
RETURN NULL;
WHEN OTHERS THEN
dbms_output.put_line('OTHERS = ' || '; Fehler = ' || sqlerrm);
RETURN NULL;
Wenn ich diese PL/SQL-Funktion "getZeit" in einem SELECT-Statement in der WHERE-Klausel bzw. in der AND-Bedingung (mit oder ohne NVL) nutze, ist alles in Ordnung, d.h. es wird immer die korrekte Anzahl von Tupeln geliefert. Das SELECT-Statement gebe ich hier mal "neutralisiert" und auf das Wesentliche reduziert wieder.
Code:
SELECT
t1.TeileID,
1,
2017
FROM
kontext.tabelle1 t1,
kontext.tabelle2 t2
WHERE
t1.TeileID = t2.TeileID (+)
AND ...
AND ...
AND NVL (kontext.getZeit(t1.TeileID), 0) = 0 -- 0 Tupel: Mit NVL = Richtig, es sollten 0 Tupel sein.
--AND kontext.getZeit(t1.TeileID) = 0 -- 0 Tupel: Ohne NVL = Richtig, es sollten 0 Tupel sein.
GROUP BY
t1.TeileID;
Nutze ich obiges SELECT-Statement (mit der PL/SQL-Funktion "getZeit" in der AND-Bedingung) jedoch in Verbindung mit der "INSERT INTO table ... SELECT ..."-Syntax zum Einfügen mehrerer Datensätze in eine Tabelle, dann werden mehr Datensätze in die Tabelle eingefügt, als es sein sollten. ;-(
Code:
INSERT INTO kontext.tabelle2
(
TeileID,
Stundensatz,
Jahr
)
SELECT
t1.TeileID,
1,
2017
FROM
kontext.tabelle1 t1,
kontext.tabelle2 t2
WHERE
t1.TeileID = t2.TeileID (+)
AND ...
AND ...
AND NVL (kontext.getZeit(t1.TeileID), 0) = 0 -- 40 Tupel: Mit NVL == Falsch, es werden 0 Tupel sein!
--AND kontext.getZeit(t1.TeileID) = 0 -- 0 Tupel: Ohne NVL = Richtig, es sollten 0 Tupel sein!
GROUP BY
t1.TeileID;
Ich habe bereits die PL/SQL-Funktion "getZeit" ausführlich und mehrfach zu Fuß überprüft, debuggt und finde darin keinen Fehler.
Der Fehler:
Was mir aufgefallen ist, dass mit der AND-Bedingung "AND NVL (kontext.getZeit(t1.TeileID), 0) = 0" z.B. 40 Tupel fälschlicherweise in die Tabelle eingefügt werden, hingegen mit der AND-Bedingung "AND kontext.getZeit(t1.TeileID) = 0" richtigerweise keine Tupel in die Tabelle eingefügt werden.
Ich bin jetzt ratlos, wo mein Fehler liegt und hoffe auf Eure hilfreichen Tips, damit ich meinen Fehler korrigieren kann.