【发布时间】:2016-07-19 10:42:40
【问题描述】:
我已经嵌套了迭代同一张表的 for 循环。在内部循环中,我更新了同一张表中的一列。但是在 for 循环条件下,我检查了更新的列,我需要在开始时而不是动态地检查此列,所以我的 for 循环迭代可能会大大减少。
我这样做是正确的还是 for 语句不会看到更新的列?
declare
control number(1);
dup number(10);
res varchar2(5);--TRUE or FALSE
BEGIN
dup :=0;
control :=0;
FOR aRow IN (SELECT MI_PRINX, geoloc,durum, ROWID FROM ORAHAN where durum=0)
LOOP
FOR bRow IN (SELECT MI_PRINX, geoloc, ROWID FROM ORAHAN WHERE ROWID>aRow.ROWID AND durum=0)
LOOP
BEGIN
--dbms_output.put_line('aRow' || aRow.Mi_Prinx || ' bRow' || bRow.Mi_Prinx);
select SDO_GEOM.RELATE(aRow.geoloc,'anyinteract', bRow.Geoloc,0.02) into res from dual;
if (res='TRUE')
THEN
Insert INTO ORAHANCROSSES values (aRow.MI_PRINX,bRow.MI_PRINX);
UPDATE ORAHAN SET DURUM=1 where rowid=bRow.Rowid;
control :=1;
--dbms_output.put_line(' added');
END IF;
EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN
dup := dup+1;
--dbms_output.put_line('duplicate');
--continue;
END;
END LOOP;
IF(control =1)
THEN
UPDATE ORAHAN SET DURUM=1 WHERE rowid=aRow.Rowid;
END IF;
control :=0;
END LOOP;
dbms_output.put_line('duplicate: '||dup);
END ;
注意:我使用 oracle 11g 和 pl/sql developer 对不起我的英语。
【问题讨论】:
-
ROWID > aRow.ROWID试图达到什么目的? Oracle 中的ROWID是(或多或少)随机字符串。ROWID > aRow.ROWID的结果未确定。除非您锁定记录,否则给定记录的 ROWID 甚至可能会更改。但是,手动锁定行通常是不好的做法。 -
我意识到我在使用 rowid 时出错了。我的目的是在外循环中一一检查所有行,但另一方面;在内部循环中,我只需要从外部循环中的选定行中检查更多行。
标签: oracle