NB:我剛纔重讀你的問題..你要失敗的。如果只有1個記錄.. 我會後在某一時刻有新的更新..
,讓我們開始在這裏..
從的Oracle®數據庫PL/SQL用戶指南和參考 10g第2版(10.2) 型號B14261-01 reference
所有行在你打開遊標時重新鎖定,而不是在取出遊標時鎖定。當您提交或回滾事務時,這些行將被解鎖。由於行不再被鎖定,所以在提交後無法從FOR UPDATE遊標讀取。
所以你不需要擔心記錄解鎖。
所以試試這個..
declare
CURSOR mytable_cur IS SELECT * FROM MY_TABLE WHERE SALARY < 50000 FOR UPDATE;
TYPE mytable_tt IS TABLE OF mytable_cur %ROWTYPE
INDEX BY PLS_INTEGER;
l_my_table_recs mytable_tt;
l_totalcount NUMBER;
begin
OPEN mytable_cur ;
l_totalcount := 0;
LOOP
FETCH mytable_cur
BULK COLLECT INTO l_my_table_recs LIMIT 100;
l_totalcount := l_totalcount + NVL(l_my_table_recs.COUNT,0);
--this is the check for only 1 row..
EXIT WHEN l_totalcount < 2;
FOR indx IN 1 .. l_my_table_recs.COUNT
LOOP
--process each record.. via l_my_table_recs (indx)
END LOOP;
EXIT WHEN mytable_cur%NOTFOUND;
END LOOP;
CLOSE mytable_cur ;
end;
ALTERNATE ANSWER 我看了你的答案向後啓動,以爲你想退出,如果有更多的則1排..不是正好有一個。所以這是我以前的答案。
2個簡單的方法來檢查只有1條記錄。
選項1 - 顯式去抓取
declare
CURSOR C1 IS SELECT * FROM MY_TABLE WHERE SALARY < 50000 FOR UPDATE;
l_my_table_rec C1%rowtype;
l_my_table_rec2 C1%rowtype;
begin
open C1;
fetch c1 into l_my_table_rec;
if c1%NOTFOUND then
--no data found
end if;
fetch c1 into l_my_table_rec2;
if c1%FOUND THEN
--i have more then 1 row
end if;
close c1;
-- processing logic
end;
我希望你的想法。
選擇2 - 異常捕獲
declare
CURSOR C1 IS SELECT * FROM MY_TABLE WHERE SALARY < 50000 FOR UPDATE;
l_my_table_rec C1%rowtype;
begin
begin
select *
from my_table
into l_my_table_rec
where salary < 50000
for update;
exception
when too_many_rows then
-- handle the exception where more than one row is returned
when no_data_found then
-- handle the exception where no rows are returned
when others then raise;
end;
-- processing logic
end;
此外 記住:用顯式遊標..你可以%鍵入您的變量關閉光標記錄而不是原始表。
當您在查詢中加入時,這特別有用。
此外,rememebr您可以用
UPDATE table_name
SET set_clause
WHERE CURRENT OF cursor_name;
類型語句更新表中的行,但我認爲如果你還沒有「獲取」第二行只會工作..
有關遊標FOR循環一些更多的信息..嘗試 Here
感謝全面的答案。我希望有可能是一個更簡單的方式來獲得的光標記錄的計數而不實際獲取的所有數據,但我更喜歡這種解決方案在出臺保存點。將一堆記錄讀入我沒有用的變量中感覺很笨拙(這實際上只是一個鎖,我需要知道我鎖定了多少記錄)。我的使用案例是我需要刪除一個記錄,但必須總是剩下一個;在我確認2存在於我的光標後,我發出一個單獨的刪除來查明我想刪除的特定記錄。 – 2010-02-19 14:36:38
好吧..也許你應該嘗試反向..和只是一個直上「重複」的行刪除。如果他們不存在..然後什麼也沒有發生。如果他們這樣做,你留下1? ..即DELETE FROM my_table WHERE(這裏只選擇重複的行); – ShoeLace 2010-02-22 22:54:18