Oracle
 sql >> база данни >  >> RDS >> Oracle

Съхранявайте резултат от минус заявка с множество колони в променлива в Oracle PL/SQL

SYS.ODCINUMBERLIST е просто списък, където всеки запис има едно число. Трябва да използвате нов тип запис, за да съхраните множеството полета във всеки ред.

Можете да дефинирате тип запис, който да използвате вместо SYS.ODCINUMBERLIST . Но бих бил склонен да преместя SELECT изразът да бъде явен курсор, така че да можете да дефинирате нов тип като курсор %ROWTYPE . По този начин вашият тип запис и командата select са винаги последователни, но това променя малко структурата на вашия код.

Ето този подход:

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;

Една забележка относно BULK COLLECT (както тук, така и в оригиналната ви публикация) -- данните, които масово събирате, се съхраняват в паметта на PGA. Така че не използвайте този код така, както е, ако има промяна, броят на новите записи ще бъде неразумен (може би повече от няколко хиляди).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете DB връзка между два екземпляра на оракул

  2. Когато въвеждам код на dateadd или datediff, получавам тази грешка през цялото време ORA-00904 DATEADD INVALID IDENTIFIER.

  3. Мога ли да използвам IF в PL/SQL?

  4. system() връща -1, errno=10, когато сте влезли в Oracle

  5. Възможно ли е да се препратят към имена на колони чрез свързващи променливи в Oracle?