sql >> Databáze >  >> RDS >> Oracle

Uložte výsledek minusového dotazu s více sloupci do proměnné v Oracle PL/SQL

SYS.ODCINUMBERLIST je pouze seznam, kde každý záznam má jedno číslo. Pro uložení více polí v každém řádku musíte použít nový typ záznamu.

Můžete definovat typ záznamu, který se použije místo SYS.ODCINUMBERLIST . Ale byl bych nakloněn přesunout SELECT příkaz být explicitní kurzor, takže můžete definovat nový typ jako kurzor %ROWTYPE . Tímto způsobem jsou váš typ záznamu a příkaz select vždy konzistentní, ale trochu to mění strukturu vašeho kódu.

Zde je tento přístup:

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;

Jedna poznámka k BULK COLLECT (jak zde, tak ve vašem původním příspěvku) -- data, která hromadně sbíráte, jsou uložena v paměti PGA. Takže nepoužívejte tento kód tak, jak je, pokud dojde ke změně, počet nových záznamů bude nepřiměřený (možná více než několik tisíc).




  1. PRAGMA table_list v SQLite

  2. pole oddělené čárkami pro porovnání v mysql

  3. Zobrazit všechny dotazy přicházející do databáze Oracle

  4. Agregace spojených sad uzlů / hran