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

INSERT и UPDATE запис с помощта на курсори в oracle

Това е изключително неефективен начин да го направите. Можете да използвате merge изявление и тогава няма нужда от курсори, цикъл или (ако можете без) PL/SQL.

MERGE INTO studLoad l
USING ( SELECT studId, studName FROM student ) s
ON (l.studId = s.studId)
WHEN MATCHED THEN
  UPDATE SET l.studName = s.studName
   WHERE l.studName != s.studName
WHEN NOT MATCHED THEN 
INSERT (l.studID, l.studName)
VALUES (s.studId, s.studName)

Уверете се, че сте commit , след като приключите, за да можете да видите това в базата данни.

За да отговоря всъщност на въпроса ви, бих го направил по следния начин. Това има предимството да върши по-голямата част от работата в SQL и да актуализира само въз основа на rowid, уникален адрес в таблицата.

Той декларира тип, в който поставяте данните групово, 10 000 реда наведнъж. След това обработва тези редове поотделно.

Въпреки това, както казах, това няма да бъде толкова ефективно, колкото merge .

declare

   cursor c_data is
    select b.rowid as rid, a.studId, a.studName
      from student a
      left outer join studLoad b
        on a.studId = b.studId
       and a.studName <> b.studName
           ;

   type t__data is table of c_data%rowtype index by binary_integer;
   t_data t__data;

begin

   open c_data;
   loop
      fetch c_data bulk collect into t_data limit 10000;

      exit when t_data.count = 0;

      for idx in t_data.first .. t_data.last loop
         if t_data(idx).rid is null then
            insert into studLoad (studId, studName)
            values (t_data(idx).studId, t_data(idx).studName);
         else
            update studLoad
               set studName = t_data(idx).studName
             where rowid = t_data(idx).rid
                   ;
         end if;
      end loop;

   end loop;
   close c_data;

end;
/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Опции за форматиране на SQLcl (Oracle)

  2. Може ли %NOTFOUND да върне null след извличане?

  3. Няма повече данни за четене от сокета

  4. Изгледът ALL_PROCEDURES не показва PROCEDURE_NAME

  5. Как да експортирате данни с Oracle SQL Developer?