SQL Cursor Loop

broxton

Cadet 4th Year
Dabei seit
Dez. 2007
Beiträge
86
Hallo,

ich habe folgendes Problem:

ich versuche gerade ein PL/SQL Script zu schreiben, welches jeweils eine ID aus einer Tabelle (im Hauptschema) mit einer ID aus einer anderen Tabelle (im Kundenschema) vergleicht und nicht vorhandene IDs auflisten soll.

Da es wie eben genannt, mehrere Kundenschemas gibt, sollen die IDs mit allen Kundentabellen aufgelistet werden. Ich denk mal mit einem Cursor Loop sollte es doch gehen oder?

Für Tipps wäre ich euch dankbar..
 

7H3 N4C3R

Lt. Commander
Dabei seit
Feb. 2002
Beiträge
1.816
Cursorloop klingt performancetechnisch irgendwie tödlich. :-) (Nachtrag: falls du vor hast sie zu verschachteln, ansonsten ist das natürlich Standard)

Wenn/falls ich dein Szenario richtig verstanden habe, ist das ein klassischer Anti-Join.
https://en.wikipedia.org/wiki/Relational_algebra#Antijoin_.28.E2.96.B7.29

Hier ein Bespiel aus den Oracle-Docs:
http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10002.htm#i2182875

Eigentlich™ sollte Oracle das erkennen können und effizient ausführen, ggf. gibt's auch noch Hints dafür.

Ansonsten erklär bitte mal, was genau du wissen willst oder wo du Hilfe brauchst. Doku zu Cursor-Loops gibt es bei Google wie Sand am Meer. ;-)
 
Zuletzt bearbeitet:

AlbertLast

Lieutenant
Dabei seit
Juni 2002
Beiträge
715
ich sehe hier kein bedarf für ein pl/sql code.
Einfach ein left join über alle in frage kommenden tabellen und nach null in der where bedingung
die datensätze suchen die keine beziehungen haben
 

broxton

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Dez. 2007
Beiträge
86
Hier mal ein Beispiel wie das SQL Statement aussieht:

SELECT erste_id FROM hauptschema.tabelle
WHERE erste_id NOT IN

(SELECT zweite_id FROM Kunde1.nachrichttabelle
UNION SELECT zweite_id FROM Kunde1.fehlertabelle
UNION SELECT zweite_id FROM Kunde1.postfachtabelle
UNION SELECT zweite_id FROM Kunde2.nachrichttabelle
UNION SELECT zweite_id FROM Kunde2.fehlertabelle
UNION SELECT zweite_id FROM Kunde2.postfachtabelle

... (und das ganze fortsetzend für weitere 38 Kundenschemas)

UNION SELECT zweite_id FROM Kunde38.nachrichttabelle
UNION SELECT zweite_id FROM Kunde38.fehlertabelle
UNION SELECT zweite_id FROM Kunde38.postfachtabelle);
 

7H3 N4C3R

Lt. Commander
Dabei seit
Feb. 2002
Beiträge
1.816
Brrrr... :o

Das lässt sich natürlich nicht mehr mit dynamischem SQL erschlagen.

Wenn es erstmal "nur" funktionieren soll, kann man natürlich das Statement in der Stored Procedure zusammen dengeln und absetzen.

Generell scheint mir die Datenbank aber eher ungeschickt aufgesetzt zu sein, wenn mit jedem Kunden ein Schema in der Datenbank verbunden ist – dafür sind die nicht wirklich da. Zumal skaliert das nur… bedingt gut. :)
 
Top