我在一個程序中有以下游標:
procedure Run is
Cur Cursor is select * from table where condition;
R Cur%rowtype;
Open Cur;
loop
fetch Cur into R;
exit when Cur%notfound;
-- Run some time consuming operations here
something...
end loop;
Close Cur;
end;
此游標運行計劃作業。
假設在運行此游標時有 100 行滿足 where 條件。
如果在程式運行時,我在表中插入了一個滿足相同 where 條件的新行,請問有什么方法可以讓游標也選擇這些新行嗎?
謝謝。干杯,
uj5u.com熱心網友回復:
不。
游標將回傳的行集是在打開游標時確定的。此時,Oracle 知道當前的 SCN(系統更改號)并將回傳該時間點存在的資料。
根據問題的性質,您可以撰寫一個回圈,不斷要求滿足條件的單行(假設您的耗時操作更新了一些資料,以便您知道需要處理什么)。就像是
loop
begin
select some_id
into l_some_id
from your_table
where needs_processing = 'Y'
order by some_id
fetch first row only;
exception
when no_data_found
then
l_some_id := null;
end;
exit when l_some_id is null;
some_slow_operation( l_some_id );
end loop;
假設some_slow_operation將標志更改needs_processing為 N。并假設您正在使用默認的已提交事務隔離級別。
uj5u.com熱心網友回復:
您可以在回圈內提??交,以便選擇查詢在每次迭代中從表中獲取最新記錄。
uj5u.com熱心網友回復:
不,游標不能做到這一點。事務是一致的,您的游標是您提取的資料的快照。如果您想要一致的結果,您可以:
- 鎖定表,這樣就不會有變化,
- 使用其他機制,例如將邏輯移動到觸發器,它將在滿足您條件的每條新資料上執行(并且也會帶來開銷,非常有情景)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/432942.html
上一篇:計算表的記錄完整性
