私は同じテーブルを繰り返すforループを入れました。内部ループでは、同じテーブルの列を更新します。しかし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 Developerの 申し訳ありませんが私の英語を使用しています。
'ROWID> aRow.ROWID'で何を達成しようとしていますか? Oracleの 'ROWID'は多かれ少なかれランダムな文字列です。 'ROWID> aRow.ROWID'の結果は決定されません。あなたがレコードをロックしない限り、与えられたレコードのROWIDは変更されるかもしれません。しかし、これは通常行を手動でロックすることをお勧めしません。 –
私はrowidの使い方が間違っていることを認識しています。私の目的は、外側のループですべての行を1つずつチェックしています。内部ループでは、私はちょうど外側のループで選択された行からさらに行をチェックする必要があります。 –