Обновление записей базы данных в цикле? - PullRequest
3 голосов
/ 17 февраля 2009
declare
begin
  for i in (select * from emp)
  loop
    if i.sal=1300 then
      update emp
      set sal=13000;
    end if;
  end loop;
end;

Этот код обновляет все записи с зарплатой 13000.
Вместо этого я хочу обновить записи с зарплатой 1300 до значения 13000.
Можете ли вы сказать, где я допустил ошибку?
Я получаю доступ к записям, используя неявный курсор.
для каждой записи я проверяю стоимость этой записи
если значение зарплаты в конкретной записи равно 1500, я хочу обновить его до 15000 ..

Ответы [ 4 ]

26 голосов
/ 17 февраля 2009

удалите этот код и просто используйте:

update emp set sal = 13000 where sal = 1300
11 голосов
/ 19 февраля 2009

Всякий раз, когда вы можете выполнить обновление одним оператором, вы должны делать это вместо использования цикла. Таким образом вы получите очень большой прирост производительности; или, наоборот, обновления в цикле стоят вам большой производительности.

Если вам действительно нужно использовать цикл, конечно, вам нужно условие where, чтобы убедиться, что вы обновляете только ту запись, которую действительно хотите обновить. Возможный способ, который всегда работает (даже если нет доступного уникального ключа), состоит в использовании псевдостолбцы rowid:

begin
  for i in (select rowid, emp.* from emp)
  loop
    if i.sal=1300 then
      update emp
      set sal=13000
      where rowid=i.rowid;
    end if;
  end loop;
end;

Другой возможностью было бы использование явного курсора и синтаксиса "update ... where current of cursorname ".

5 голосов
/ 17 февраля 2009

Этот код обновляет все записи с зарплатой 13000. Вместо этого я хочу обновить записи с зарплатой 1300 до значения 13000.

для каждой записи, которую я проверяю саль значение этой записи .. если значение зарплаты в конкретной записи равно 1500, я хочу обновить ее до 15000 ..

Так что именно вы хотите?

Вы хотите обновить только 1500 зарплат, вы выдаете:

UPDATE emp
SET sal = 15000
WHERE sal = 1500;

Вы хотите увеличить всю зарплату в десять раз, вы выдаете:

UPDATE emp
SET sal = sal * 10;
5 голосов
/ 17 февраля 2009

Вам нужно наложить ограничение на оператор обновления.

То, что у вас есть в данный момент, будет циклически проходить по строкам результатов, и если оно найдет строку с зарплатой, равной 1300, если затем выполнится, он будет следовать SQL:

update emp 
set sal=13000;

Без ограничений это обновляет каждую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...