Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Oracle 11g R2 sql/eine Tabelle mit Hilfe einer anderen aktualisieren

Empfohlene Antworten

Veröffentlicht

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

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

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... 

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. 

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

 

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

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?

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.