sql >> Database teknologi >  >> RDS >> Oracle

INDSÆT og OPDATERE en post ved hjælp af markører i oracle

Dette er en meget ineffektiv måde at gøre det på. Du kan bruge merge sætning, og så er der ikke behov for markører, looping eller (hvis du kan undvære) 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)

Sørg for at du commit , når det er afsluttet, for at kunne se dette i databasen.

For faktisk at svare på dit spørgsmål ville jeg gøre det som følger. Dette har fordelen ved at udføre det meste af arbejdet i SQL og kun opdatere baseret på rowiden, en unik adresse i tabellen.

Det erklærer en type, som du placerer dataene i i bulk, 10.000 rækker ad gangen. Behandler derefter disse rækker individuelt.

Men som jeg sagde, vil dette ikke være så effektivt som 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. Sådan rettes forkert strengværdi i MySQL

  2. Hvordan laver man en case-sensitive GROUP BY?

  3. SQL Server – Dissekere det interne af sp_spaceused

  4. Sådan redigeres MySQL my.cnf-filen