Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Speichern Sie das Ergebnis einer Minus-Abfrage mit mehreren Spalten in einer Variablen in Oracle PL/SQL

SYS.ODCINUMBERLIST ist nur eine Liste, in der jeder Datensatz eine einzelne Nummer hat. Sie müssen einen neuen Datensatztyp verwenden, um die mehreren Felder in jeder Zeile zu speichern.

Sie könnten einen Datensatztyp definieren, der anstelle von SYS.ODCINUMBERLIST verwendet werden soll . Aber ich wäre geneigt, den SELECT zu verschieben -Anweisung als expliziten Cursor, sodass Sie einen neuen Typ als Cursor %ROWTYPE definieren könnten . Auf diese Weise sind Ihr Datensatztyp und die Select-Anweisung immer konsistent, aber es ändert die Struktur Ihres Codes ein wenig.

Hier ist dieser Ansatz:

DECLARE 

  CURSOR c_select IS
      SELECT project_id, project_name
      FROM 
        (
          SELECT t1.project_id, t1.project_name FROM table_one t1
          MINUS
          SELECT t2.project_id, t2.project_name FROM table_two t2 );

  TYPE l_missing_row_list_typ IS TABLE OF c_select%ROWTYPE;
  l_missing_row_list l_missing_row_list_typ;
  
BEGIN
  OPEN c_select;
  FETCH c_select BULK COLLECT INTO l_missing_row_list;
  CLOSE c_select;
  
  FORALL i IN l_missing_row_list.FIRST..l_missing_row_list.LAST
    INSERT INTO table_two VALUES ( l_missing_row_list(i).project_id, l_missing_row_list(i).project_name );
    
  COMMIT;
  
  -- Values are now inserted and you have the list of IDs in l_missing_row_list to add to your email.
END;

Eine Anmerkung zur BULK COLLECT (sowohl hier als auch in Ihrem ursprünglichen Beitrag) - die Daten, die Sie massenhaft sammeln, werden im PGA-Speicher gespeichert. Verwenden Sie diesen Code also nicht unverändert, wenn es eine Änderung gibt, wird die Anzahl der neuen Datensätze unangemessen sein (vielleicht mehr als ein paar Tausend).