не работает скрипт, помогите.

недоумевающий
Дата: 03.11.2008 23:36:48
Здравствуйте, уважаемые.

Помогите разобраться или посоветуйте, пожалуйста, что делать.

Требуется обновить значения столбца(не являющегося первичным ключом) в таблице из 4 млн строк.

create table T
(
pk number,
fk number
)

Необходимо поменять fk.
Мои действия:
1.Добавил индекс по fk
2.
declare 
v_c number;
begin
for i in
(
select rowid ro, fk
from t
)
loop
select new_fk into v_c
from таблица_связи_старого_и_нового_идентификаторов
where old_fk=i.fk;
update t
set fk=v_c
where rowid=i.ro;
end loop;
commit;
exception
when others then null;
end;
при отработке
выдается сообщение, что код sucessfully completed, однако часть данных не обновляется.
Это не из-за no_data_found, я проверил.
Почему может быть такое, подскажите, пожалуйста.
Спасибо!!!
A.K.
Дата: 04.11.2008 00:44:51
1) Эта задача решается одним UPDATE'ом, без привлечения циклов и PL/SQL. Так будет правильнее и быстрее, исключит грабли из-за потенциальных изменений в таблицах со стороны других транзакций.
2) exception when others then null; - это чтобы, не дай Бог, не увидеть истинную причину ошибки, если таковая произойдет?
недоумевающий
Дата: 04.11.2008 20:06:18
спасибо на добром слове
Одним update-ом этот запрос мне написать слабо.
Напиши что ты имел в виду, пожалуйста.

Пришло в голову еще одно решение, завтра попробую.

create table t1
as
select t.pk pk,
t1.fknew fk
from t, both_fk_fkold t1
where ...

drop table t;

rename table t1 to t;

Очень хочу увидеть решение с одним апдейтом, спасибо.
dmidek
Дата: 04.11.2008 20:12:46
недоумевающий
Очень хочу увидеть решение с одним апдейтом, спасибо.


На примере scott-a, элементарный коррелированный update

SQL> update emp e
  2     set ename = (select dname from dept d where d.deptno = e.deptno)
  3  /
 
14 rows updated
 
SQL> select * from dept
  2  /
 
DEPTNO DNAME          LOC
------ -------------- -------------
    10 ACCOUNTING     NEW YORK
    20 RESEARCH       DALLAS
    30 SALES          CHICAGO
    40 OPERATIONS     BOSTON
 
SQL> select empno, ename, deptno from emp
  2  /
 
EMPNO ENAME      DEPTNO
----- ---------- ------
 7369 RESEARCH       20
 7499 SALES          30
 7521 SALES          30
 7566 RESEARCH       20
 7654 SALES          30
 7698 SALES          30
 7782 ACCOUNTING     10
 7788 RESEARCH       20
 7839 ACCOUNTING     10
 7844 SALES          30
 7876 RESEARCH       20
 7900 SALES          30
 7902 RESEARCH       20
 7934 ACCOUNTING     10
 
14 rows selected
 
SQL> rollback
  2  /
 
Rollback complete
 
SQL>