sql >> Base de Datos >  >> RDS >> Oracle

Almacene el resultado de la consulta menos con varias columnas en una variable en Oracle PL/SQL

SYS.ODCINUMBERLIST es solo una lista donde cada registro tiene un solo número. Debe usar un nuevo tipo de registro para almacenar los múltiples campos en cada fila.

Podría definir un tipo de registro para usar en lugar de SYS.ODCINUMBERLIST . Pero me inclinaría a mover el SELECT declaración para ser un cursor explícito, de modo que pueda definir un nuevo tipo como cursor %ROWTYPE . De esa manera, su tipo de registro y la declaración de selección siempre son consistentes, pero cambia un poco la estructura de su código.

Aquí está ese enfoque:

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;

Una nota sobre BULK COLLECT (tanto aquí como en su publicación original):los datos que recopila de forma masiva se almacenan en la memoria de PGA. Por lo tanto, no use este código tal como está si hay un cambio, la cantidad de registros nuevos no será razonable (tal vez más de unos pocos miles).