sql >> Databáze >  >> RDS >> Oracle

INSERT a UPDATE záznam pomocí kurzorů v oracle

Toto je vysoce neefektivní způsob, jak toho dosáhnout. Můžete použít merge a pak už nejsou potřeba kurzory, smyčkování nebo (pokud se obejdete bez) 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)

Ujistěte se, že jste se commit , po dokončení, abyste to mohli vidět v databázi.

Abych skutečně odpověděl na vaši otázku, udělal bych to následovně. To má tu výhodu, že většinu práce provádíte v SQL a aktualizujete pouze na základě rowid, jedinečné adresy v tabulce.

Deklaruje typ, do kterého umístíte data hromadně, 10 000 řádků najednou. Poté tyto řádky zpracuje jednotlivě.

Jak však říkám, nebude to tak efektivní jako 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. Jak zobrazím všechny cizí klíče k tabulce nebo sloupci?

  2. Seznam datových typů v SQL Server 2017

  3. Vytvoření tabulky s kompresí v SQL Server (T-SQL)

  4. SCD typ 4