sql >> Databasteknik >  >> RDS >> Oracle

INFOGA och UPPDATERA en post med hjälp av markörer i Oracle

Detta är ett mycket ineffektivt sätt att göra det på. Du kan använda merge uttalande och då finns det inget behov av markörer, looping eller (om du kan klara dig utan) 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)

Se till att du commit , när det är klart, för att kunna se detta i databasen.

För att faktiskt svara på din fråga skulle jag göra det ungefär som följer. Detta har fördelen av att göra det mesta av arbetet i SQL och bara uppdatera baserat på rowid, en unik adress i tabellen.

Den deklarerar en typ som du placerar data i i bulk, 10 000 rader åt gången. Bearbetar sedan dessa rader individuellt.

Men som jag sa kommer detta inte att vara lika 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. Ta bort rader med MySQL LEFT JOIN

  2. MySQL ROUND() Funktion – Runda ett tal till ett givet antal decimaler

  3. Hur kan du få de aktiva användarna anslutna till en postgreSQL-databas via SQL?

  4. spara List<Model class> till sqlite