sql >> Database >  >> RDS >> Oracle

Bewaar resultaat van min-query met meerdere kolommen in een variabele in Oracle PL/SQL

SYS.ODCINUMBERLIST is slechts een lijst waarbij elke record een enkel nummer heeft. U moet een nieuw recordtype gebruiken om de meerdere velden in elke rij op te slaan.

U kunt een recordtype definiëren om te gebruiken in plaats van SYS.ODCINUMBERLIST . Maar ik zou geneigd zijn om de SELECT statement om een ​​expliciete cursor te zijn, zodat u een nieuw type kunt definiëren als cursor %ROWTYPE . Op die manier zijn uw recordtype en de select-instructie altijd consistent, maar het verandert de structuur van uw code een beetje.

Dit is die benadering:

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;

Een opmerking over de BULK COLLECT (zowel hier als in uw oorspronkelijke bericht) -- de gegevens die u in bulk verzamelt, worden opgeslagen in PGA-geheugen. Gebruik deze code dus niet, want als er een wijziging is, zal het aantal nieuwe records onredelijk zijn (misschien meer dan een paar duizend).




  1. hoe mysql-trigger te schrijven?

  2. Hoe regels met code van verpakte procedures en functies in Oracle te vinden?

  3. Hoe SELECTEER ik gegevens uit een onderliggende tabel in PostgreSQL?

  4. Wat is de juiste odbc-opdracht voor het aanroepen van de Oracle-opgeslagen procedure met parameters van .Net?