2017-03-22 7 views
0

Vergleichen Sie die Datenunterschiede zwischen den beiden folgenden Tabellen. Ich habe dies erreicht, indem ich eine MINUS-Abfrage geschrieben habe, die aber für die aktuelle Zuweisung nicht geeignet ist. Weil nur wenige Tabellen 50-60 Spalten haben und jedes Mal die Spalten vor der Ausführung angeben müssen.plsql-Prozedur, um zwei Tabellen ohne Primärschlüsselspalte zu vergleichen

Ich habe Expert's response gefolgt und das Ziel nicht erreicht. Grundsätzlich möchte ich eine Prozedur schreiben, die:

  1. Akzeptiert beide Tabellennamen als Parameter.
  2. Holen Sie alle Spalten von CustomerTable.
  3. Dann MINUS Abfrage zwischen CustomerTable und StagingCustTable nur mit den Spalten in Schritt-2 abgerufen.
  4. Protokollieren Sie alle Unterschiede.

Customer

  • Custromer_Number
  • Adresse
  • ORDER_NUMBER
  • Kontakt
  • Land
  • POST_CODE
  • Betrag

StagingCustTable

  • Custromer_Number
  • Adresse
  • ORDER_NUMBER
  • Kontakt
  • Land
  • POST_CODE
  • Betrag
  • RUN_ID
  • RECORD_ID
+0

Run_Id und Record_Id können ignoriert werden, um Unterschiede zu erhalten. – MathurS

+0

Wie würden die Ergebnisse der letzten Minus-Abfrage verwendet? Für 'execute direkt 'müßten Sie in Variablen oder Sammlungen auswählen, die Vorkenntnisse über die Struktur erfordern würden. Sie könnten vielleicht 'dbms_sql' verwenden, um einen Ref-Cursor basierend auf der Abfrage zu öffnen, die aus den Tabellenspalten erstellt wurde, aber dann muss etwas mit diesem Ref-Cursor umgehen. (Was so einfach sein könnte wie SQL \ * Plus ''print'-Befehl, hängt aber davon ab, was Ihre Absichten sind). Sofern Sie dies nicht wirklich benötigen, ist Krokodilkos Ansatz viel einfacher. –

Antwort

1

Ich würde eine Prozedur nicht verwenden, aber eine Abfrage eine abschließende Abfrage zu generieren.
Art von dynamischem SQL.
Einfaches Beispiel - lassen Sie sagen, dass wir die folgenden Tabellen und Daten in ihnen: Jetzt

CREATE TABLE CustomerTable(
Custromer_Number int, 
Address varchar2(100), 
order_Number int, 
Contact int, 
Country varchar2(10), 
Post_Code varchar2(10), 
Amount number 
); 

INSERT ALL 
INTO CustomerTable VALUES (1, 'aaa', 1, 1, 'AA', '111', 111.11) 
INTO CustomerTable VALUES (2, 'bbb', 2, 2, 'BB', '222', 222.22) 
SELECT 1 FROM dual; 

CREATE TABLE StagingCustTable 
AS SELECT t.*, 1 As run_id, 1 as record_id 
FROM CustomerTable t 
WHERE 1=0; 

INSERT ALL 
INTO StagingCustTable VALUES (1, 'aaa', 1, 1, 'AA', '111', 111.11, 1, 1) 
INTO StagingCustTable VALUES (3, 'ccc', 3, 3, 'CC', '333', 333.33, 3, 3) 
SELECT 1 FROM dual; 
commit; 

, wenn Sie diese einfache Abfrage:

SELECT 'SELECT ' || listagg(column_name, ',') WITHIN GROUP (ORDER BY column_id) 
     || chr(10) || ' FROM ' || max(table_name) 
     || chr(10) || ' MINUS ' 
     || chr(10) || 'SELECT ' || listagg(column_name, ',') WITHIN GROUP (ORDER BY column_id) 
     || chr(10) || ' FROM StagingCustTable ' as MySql 
FROM user_tab_columns 
WHERE table_name = upper('CustomerTable'); 

Sie folgendes Ergebnis:

MYSQL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
------------------------------------------------------------------------- 
SELECT CUSTROMER_NUMBER,ADDRESS,ORDER_NUMBER,CONTACT,COUNTRY,POST_CODE,AMOUNT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    FROM CUSTOMERTABLE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
MINUS                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
SELECT CUSTROMER_NUMBER,ADDRESS,ORDER_NUMBER,CONTACT,COUNTRY,POST_CODE,AMOUNT 
FROM StagingCustTable 

Kopieren Sie einfach die obige Abfrage, fügen Sie sie in Ihren SQL-Client ein, führen Sie sie aus - und die Aufgabe ist in wenigen Minuten erledigt.

+0

Eigentlich muss ich diesen Code in Paket kombinieren, um eine Reihe von Verifikation abzuschließen. Daher Prozedur oder Funktion, die die Unterschiede auch in Datei oder Konsole schreiben kann. Ja zusammen mit der obigen dynamischen Abfrage. – MathurS

Verwandte Themen