Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Armazene o resultado da consulta negativa com várias colunas em uma variável no Oracle PL/SQL


SYS.ODCINUMBERLIST é apenas uma lista onde cada registro tem um único número. Você precisa usar um novo tipo de registro para armazenar os vários campos em cada linha.

Você pode definir um tipo de registro para usar no lugar de SYS.ODCINUMBERLIST . Mas eu estaria inclinado a mover o SELECT declaração para ser um cursor explícito, para que você possa definir um novo tipo como cursor %ROWTYPE . Dessa forma, seu tipo de registro e a instrução select são sempre consistentes, mas alteram um pouco a estrutura do seu código.

Aqui está essa abordagem:
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;

Uma observação sobre o BULK COLLECT (tanto aqui quanto em seu post original) -- os dados que você está coletando em massa são armazenados na memória PGA. Portanto, não use este código como está, se houver uma alteração, o número de novos registros não será razoável (talvez mais do que alguns milhares).