Gast Teddi Geschrieben 27. August 2019 Teilen Geschrieben 27. August 2019 Hallo ihr lieben ich habe folgendes Problem und brauche euch. Danke im voraus. (Ich bin auf Oracle 11g R2) Ich habe auf 2 verschiedenen oracle Server(orcl1 und orcl2) die gleiche Tabelle mit folgender Struktur. compag_orcl1 username | id | compag -------------------------- USER1 |us1id1| CMR USER1 |us1id1| RWD USER1 |us1id1| SING USER1 |us1id1| CNG -------------------------- USER2 |us2id2| SEN USER2 |us2id2| CND USER2 |us2id2| CGT USER2 |us2id2| CNG USER2 |us2id2| KPG -------------------------- USER3 |us3id3| RWD USER3 |us3id3| CND USER3 |us3id3| CID USER3 |us3id3| CNG USER3 |us3id3| SING Und ihre Kopie auf orcl2 compag_orcl2 username | id | compag -------------------------- USER1 |us1id1| RWD USER1 |us1id1| SING USER1 |us1id1| CNG -------------------------- USER2 |us2id2| SEN USER2 |us2id2| CNG USER2 |us2id2| KPG -------------------------- USER3 |us3id3| RWD USER3 |us3id3| CND USER3 |us3id3| SING Ich möchte gern in compag_orcl2 die fehlenden Zeilen aus compag_orcl1, die mit "C" anfangen, einfügen. DAnke nochmal für eure Mühe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Whiz-zarD Geschrieben 27. August 2019 Teilen Geschrieben 27. August 2019 Schaue dir dazu MERGE an: https://www.oracle.com/webfolder/technetwork/de/community/apex/tipps/sql-merge/index.html https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm#SQLRF01606 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Whiz-zarD Geschrieben 27. August 2019 Teilen Geschrieben 27. August 2019 Es würde aber auch mit einem INSERT INTO in Verbindung mit einem NOT EXISTS funktionieren. INSERT INTO TABLE2 (...) SELECT TABLE1. ..., FROM TABLE1 WHERE NOT EXISTS ( SELECT * FROM TABLE2 WHERE TABLE1. ... = TABLE2. ... ); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Tedi Geschrieben 27. August 2019 Teilen Geschrieben 27. August 2019 Lieber Whiz-zarD Danke!! Ich habe inzwischen die meine ErgebnisMenge bekommen können. Zum Einfügen habe ich mir eine Funktion geschrieben, die leider noch nicht so tut was sie soll. ***** Korrektur: ich hatte vorhin die Spalte in beiden Tabellen die Spalte seq vergessen. Daher nochmal die TabellenStruktur. **** create or replace function comp (p_error OUT VARCHAR2) RETURN BOOLEAN is cursor compa_cur is select * from compag_orcl1@orcl1 c1 where c1.compag like 'C%' and not exists (select 1 from compag_orcl2 c2 where c1.username = c2.username and c1.id = c2.id and c1.compag = c2.compag); compa_tmp compa_cur%ROWTYPE; begin open compa_cur ; loop fetch compa_cur into compa_tmp; exit when compa_cur%NOTFOUND; insert into compag_orcl2 (USERNAME, compag, id, Seq) values (compa_cur.username, compa_cur.compag, compa_cur.id, Seq_cmp.nextval); commit; end loop; close compa_cur; return true; end comp; compag_orcl1 username | id | compag| seq -------------------------------------- USER1 |us1id1| CMR| 123 USER1 |us1id1| RWD| 456 USER1 |us1id1| SING| 789 USER1 |us1id1| CNG | 1011 ------------------------------------ USER2 |us2id2| SEN | 1213 USER2 |us2id2| CND | 1415 USER2 |us2id2| CGT | 1617 USER2 |us2id2| CNG | 1819 USER2 |us2id2| KPG | 2021 ------------------------------------ USER3 |us3id3| RWD| 2223 USER3 |us3id3| CND | 2425 USER3 |us3id3| CID | 2627 USER3 |us3id3| CNG | 2829 USER3 |us3id3| SING| 3031 und die Kopie auf orcl2 compag_orcl2 username | id | compag |seq ------------------------------------- USER1 |us1id1| RWD|0010 USER1 |us1id1| SING|0011 USER1 |us1id1| CNG |0012 ------------------------------------ USER2 |us2id2| SEN|0013 USER2 |us2id2| CNG|0014 USER2 |us2id2| KPG|0015 ----------------------------------- USER3 |us3id3| RWD|0016 USER3 |us3id3| CND|0017 USER3 |us3id3| SING|0018 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 sylenz Geschrieben 27. August 2019 Teilen Geschrieben 27. August 2019 Warum nicht eine bereits vorgeschlagene Variante nutzen? Die sind einfacher und schneller. Pl/SQL nur verwenden wenn klassisches SQL nicht reicht. Und selbst dann immer per bulk und nicht zeilenweise... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Tedi Geschrieben 27. August 2019 Teilen Geschrieben 27. August 2019 Hallo Sylenz Danke für deine Antwort. Ich habe an pl sql gedacht, weil ich die Sequenz auch berücksichtigen muss. Aber wenn es anders geht dann gerne. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Whiz-zarD Geschrieben 27. August 2019 Teilen Geschrieben 27. August 2019 PL/SQL ist doch überhaupt nicht von Nöten. Merge: MERGE INTO compag_orcl2 dest USING (SELECT * FROM compag_orcl1) src ON (src.username = dest.username AND src.id = dest.id AND src.compag = dest.compag) WHEN NOT MATCHED THEN INSERT (username, id, compag, seq) VALUES (src.username, src.id, src.compag, Seq_cmp.nextval) Insert Into: INSERT INTO compag_orcl2 (username, id, compag, seq) SELECT compag_orcl1.username, compag_orcl1.id, compag_orcl1.compag, Seq_cmp.nextval FROM compag_orcl1 WHERE NOT EXISTS ( SELECT * FROM compag_orcl2 WHERE compag_orcl1.username = compag_orcl2.username AND compag_orcl1.id = compag_orcl2.id AND compag_orcl1.compag = compag_orcl2.compag ); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Tedi Geschrieben 28. August 2019 Teilen Geschrieben 28. August 2019 vor 17 Stunden schrieb Whiz-zarD: Danke Whiz-zarD. Leider funktioniert das Merge nicht indem die fehlenden "compag" Zeilen nicht eingefügt werden. Das insert löst mein Problem mit der Sequenz nicht so wirklich. Weil du holst ja die seq.nextval aus orcl1. Was mache ich mit meiner Sequenz auf orcl2? Danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Whiz-zarD Geschrieben 28. August 2019 Teilen Geschrieben 28. August 2019 vor 59 Minuten schrieb Tedi: Leider funktioniert das Merge nicht indem die fehlenden "compag" Zeilen nicht eingefügt werden. Verstehe ich nicht, was du meinst. Er nimmt die Spalte aus orcl1 und schreibt sie in orcl2. Wenn er beim Merge in orcl2 kein Datensatz findet, der zu der Bedingung passt, dann wird ein neuer Datensatz in orcl2 angelegt. vor 58 Minuten schrieb Tedi: Was mache ich mit meiner Sequenz auf orcl2? Indem du einfach die Sequence von orcl2 nimmst. Wo ist das Problem? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Tedi Geschrieben 28. August 2019 Teilen Geschrieben 28. August 2019 vor 19 Stunden schrieb Whiz-zarD: Danke Whiz-zarD. Leider funktioniert das Merge nicht indem die fehlenden "compag" Zeilen nicht eingefügt werden. Das insert löst mein Problem mit der Sequenz nicht so wirklich. Weil du holst ja die seq.nextval aus orcl1. Was mache ich mit meiner Sequenz auf orcl2? Danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
0 Tedi Geschrieben 28. August 2019 Teilen Geschrieben 28. August 2019 Danke Whiz-zarD. Es hat mit dem insert wunderbar geklappt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Frage
Gast Teddi
Hallo ihr lieben ich habe folgendes Problem und brauche euch. Danke im voraus. (Ich bin auf Oracle 11g R2)
Ich habe auf 2 verschiedenen oracle Server(orcl1 und orcl2) die gleiche Tabelle mit folgender Struktur.
Und ihre Kopie auf orcl2
Ich möchte gern in compag_orcl2 die fehlenden Zeilen aus compag_orcl1, die mit "C" anfangen, einfügen.
DAnke nochmal für eure Mühe
Link zu diesem Kommentar
Auf anderen Seiten teilen
10 Antworten auf diese Frage
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.