我已經嵌套for循環迭代相同的表。在內循環中,我更新了同一個表中的一列。但是,在for循環條件中,我檢查更新的列,我需要不是在開始時動態檢查此列,所以我的循環迭代可能會大大減少。oracle中for循環語句的update語句是否有任何影響?
我這樣做是正確的還是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開發 對不起我的英語。
你試圖通過'ROWID> aRow.ROWID'實現什麼? Oracle中的「ROWID」是一個(或多或少)隨機字符串。未確定'ROWID> aRow.ROWID'的結果。除非您鎖定記錄,否則給定記錄的ROWID甚至可能會更改。但是,手動鎖定行通常是不好的做法。 –
我意識到我在使用rowid時出錯了。我的目的是在外部循環中逐個檢查所有行,在內部循環中,我只需要從外部循環中的選定行中檢查更多的行。 –