sql >> Database teknologi >  >> RDS >> Oracle

Gem resultatet af minusforespørgsel med flere kolonner i en variabel i Oracle PL/SQL

SYS.ODCINUMBERLIST er blot en liste, hvor hver post har et enkelt nummer. Du skal bruge en ny posttype for at gemme de flere felter i hver række.

Du kan definere en posttype til brug i stedet for SYS.ODCINUMBERLIST . Men jeg ville være tilbøjelig til at flytte SELECT sætning til at være en eksplicit markør, så du kan definere en ny type som markør %ROWTYPE . På den måde er din posttype og select-sætningen altid konsistente, men det ændrer strukturen på din kode en smule.

Her er den tilgang:

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;

En bemærkning om BULK COLLECT (både her og i dit oprindelige indlæg) -- de data, du samler i bulk, er gemt i PGA-hukommelsen. Så brug ikke denne kode som den er, hvis der er en ændring, vil antallet af nye poster være urimeligt (måske mere end et par tusinde).




  1. Sådan slippes en fremmednøgle i SQLite

  2. Vanskelig MySQL batch-forespørgsel

  3. Tilføj værdier fra samme dato

  4. Oracle opdateringserklæring med gruppefunktion