sql >> Databasteknik >  >> RDS >> Oracle

Lagra resultatet av minusfrågan med flera kolumner i en variabel i Oracle PL/SQL

SYS.ODCINUMBERLIST är bara en lista där varje post har ett enda nummer. Du måste använda en ny posttyp för att lagra flera fält på varje rad.

Du kan definiera en posttyp att använda i stället för SYS.ODCINUMBERLIST . Men jag skulle vara benägen att flytta SELECT uttalande att vara en explicit markör, så att du kan definiera en ny typ som markör %ROWTYPE . På så sätt är din posttyp och select-satsen alltid konsekventa, men det ändrar strukturen på din kod lite.

Här är det tillvägagångssättet:

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 anmärkning om BULK COLLECT (både här och i ditt ursprungliga inlägg) -- data som du samlar in lagras i PGA-minne. Så använd inte den här koden som den är om det sker en förändring kommer antalet nya poster att vara orimligt (kanske fler än några tusen).




  1. distinkt antal (*)

  2. Matrisdatatyp, delad sträng,

  3. Översätter fråga från Firebird till PostgreSQL

  4. SQL - Konvertera Datetime-format