Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Przechowuj wynik zapytania minus z wieloma kolumnami w zmiennej w Oracle PL/SQL

SYS.ODCINUMBERLIST to tylko lista, na której każdy rekord ma jeden numer. Musisz użyć nowego typu rekordu, aby przechowywać wiele pól w każdym wierszu.

Możesz zdefiniować typ rekordu do użycia zamiast SYS.ODCINUMBERLIST . Ale byłbym skłonny przenieść SELECT instrukcja, aby była jawnym kursorem, dzięki czemu można zdefiniować nowy typ jako kursor %ROWTYPE . W ten sposób typ rekordu i instrukcja select są zawsze spójne, ale zmienia nieco strukturę kodu.

Oto takie podejście:

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 uwaga na temat BULK COLLECT (zarówno tutaj, jak i w oryginalnym poście) -- dane, które zbierasz zbiorczo, są przechowywane w pamięci PGA. Więc nie używaj tego kodu tak, jak jest, jeśli nastąpi zmiana, liczba nowych rekordów będzie nieuzasadniona (może więcej niż kilka tysięcy).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie możesz użyć zapytania LIKE w PreparedStatement JDBC?

  2. Czy pula połączeń jest koniecznością w ODP.NET?

  3. Oracle Text nie będzie działać z NVARCHAR2. Co jeszcze może być niedostępne?

  4. Utwórz wiodące zero w Oracle

  5. Sql łączący dwie kolumny w jedną zmienną