www.blueshop.com.tw Open in urlscan Pro
220.135.127.219  Public Scan

URL: http://www.blueshop.com.tw/board/FUM200410061527578K1/BRD20101013103357TFP.html
Submission: On October 18 via api from PH — Scanned from DE

Form analysis 1 forms found in the DOM

https://www.google.com/cse

<form action="https://www.google.com/cse" id="cse-search-box" target="GoogleSearch"></form>

Text Content

台灣最大程式設計社群網站
∣免費加入會員∣登入 ∣回首頁∣ 您好

線上人數
1661  
會員總數:246493
討論主題:190002

討論區
程式下載/上傳
科技新聞
專欄文章
會員中心
加值服務
外包接案
求職求才


登入

登出

歡迎您免費加入會員

討論區選單
 * 新手必讀
 * 我要提問!!
 * 討論區
 * 個人討論區
 * 我的關注主題
 * 我的黑名單
 * 討論區EP英雄榜
 * 專家等級說明
 * 討論區常見問題
 * 兌換發問點數QP
 * 扣點申請加值服務
 * 申請版主

開發工具
 * ASP
 * ASP.NET
 * C#
 * VB.NET
 * VB6
 * C/C++
 * PHP
 * Java
 * Java Script/ Node.js
 * AJAX / JSON / jQuery
 * 其他語言

行動裝置開發
 * Android APP 開發
 * iOS APP/ swift 開發
 * Windows Phone APP

資料庫
 * ACCESS
 * MS SQL
 * MySQL
 * Oracle
 * 其他DB

多媒體 / 網管
 * CSS/HTML5/Bootstarp
 * 影像處理
 * office VBA / WinOS
 * Windows 伺服器
 * Linux / Unix
 * 網管 / 資安 / VM
 * 硬體 / 週邊 / 其他

綜合
 * 求職求才
 * 外包接案
 * 心情甘苦談
 * 網站經營 / 合夥 / 證照
 * 建言 / 公告

文章區
 * 專欄文章
 * 科技新聞
 * Blog精華文章

討論區列表 >> Oracle >> 請問 ORA-01002 擷取的順序不對
[]  
[我要回覆]
1

請問 ORA-01002 擷取的順序不對
價值 : 70 QP  點閱數:12549 回應數:9


樓主

Justin



0 16 290 19

發送站內信



我在執行 procedure 時遇到 ORA-01002 擷取的順序不對的問題,
直覺猜測是因為有使用 cursor 的原因,上網查了一下,
"好像"是因為使用 cursor 下了 for update 語法時,會 lock 住 fetch 的資料,
此時 update 那筆資料會造成 ORA-01002 的錯誤。
但我不太確定是不是這樣,但之前有以類似方式寫過別支 procedure,執行時卻沒這個問題。
請問大家,「ORA-01002 擷取的順序不對」的問題要怎麼解呢?謝謝!


--------------------------------------------------------------------------------

搜尋相關Tags的文章: [ ORA-01002 擷取的順序不對 ] , [ ora ] , [ 01002 ] , [ ora-01002 ] , [
fetch out of ] ,
本篇文章發表於2010-10-13 10:34


1樓
回應

花旗蔘

把script 貼上來吧
本篇文章回覆於2010-10-13 13:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Justin

有兩個 procedure,P_AAA 會呼叫 P_BBB

CREATE OR REPLACE PROCEDURE P_AAA
IS
CURSOR a_cur IS
SELECT ca,cb
FROM table_a
WHERE cc= 'xxx'
ORDER BY ca,cd
FOR UPDATE;

a_rec a_cur%ROWTYPE;

BEGIN

if not a_cur%ISOPEN then
open a_cur;
end if;

loop
FETCH a_cur INTO a_rec;
EXIT WHEN a_cur%NOTFOUND;

P_BBB(a_cur.ca,a_cur.cb);

end loop;

COMMIT;
END;
/

以下是 P_BBB

CREATE OR REPLACE PROCEDURE P_BBB
(
p_a IN number,
p_b IN number
)

IS
v_a number := p_b;

CURSOR b_cur IS
SELECT ca,cb,cc,cd
FROM table_b
WHERE ca = p_a
ORDER BY cb
FOR UPDATE;

b_rec b_cur%ROWTYPE;

BEGIN

if not b_cur%ISOPEN then
open b_cur;
end if;

loop
FETCH b_cur INTO b_rec;
EXIT WHEN b_cur%NOTFOUND;

if b_rec.cd is not null and b_rec.cd > 0 then
if v_a > 0 then
if b_rec.cd >= v_a then
update table_b
set cc = cc + v_a,
cd = cd - v_a
where ca = p_a
and cb = b_rec.cb;

v_a := 0;
else
v_a := v_a - b_rec.cd;

update table_b
set cd = 0,
cc = ce
where ca = p_a
and cb = b_rec.cb;
end if;
end if;
end if;

end loop;

COMMIT;
END;
/
本篇文章回覆於2010-10-13 14:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

Justin

沒有人知道怎麼解嗎? >"<
本篇文章回覆於2010-10-14 16:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

花旗蔘

你把 P_BBB 的commit 註解掉試試~


本篇文章回覆於2010-10-14 18:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
最有價值解答

花旗蔘

其實執行後的錯誤訊息 就有很明顯的訊息了
你p_aaa 在 fetch loop中 呼叫p_bbb 而p_bbb裡面有commit
你原p_aaa的cursor是select for update的
而你在之後的fetch loop 下了commit(p_bbb) 改變了它的狀態,這錯誤由此而來

-----test
create or replace procedure ben.abc
is
cursor p is
select * from dual for update;
b p%ROWTYPE;
begin
open p;
loop
FETCH p INTO b;
EXIT WHEN p%NOTFOUND;
commit;
end loop;
end;

----------------

----執行
execute ben.abc

命令的第 1 行開始發生錯誤:
execute ben.abc
錯誤報告:
ORA-01002: &iquest;&iquest;&iquest;&iquest;&iquest;&iquest;&iquest;
ORA-06512: &iquest; "BEN.ABC", line 9
ORA-06512: &iquest; line 1
01002. 00000 - "fetch out of sequence"
*Cause: This error means that a fetch has been attempted from a cursor
which is no longer valid. Note that a PL/SQL cursor loop
implicitly does fetches, and thus may also cause this error.
There are a number of possible causes for this error, including:
1) Fetching from a cursor after the last row has been retrieved
and the ORA-1403 error returned.
2) If the cursor has been opened with the FOR UPDATE clause,
fetching after a COMMIT has been issued will return the error.
3) Rebinding any placeholders in the SQL statement, then issuing
a fetch before reexecuting the statement.
*Action: 1) Do not issue a fetch statement after the last row has been
retrieved - there are no more rows to fetch.
2) Do not issue a COMMIT inside a fetch loop for a cursor
that has been opened FOR UPDATE.
3) Reexecute the statement after rebinding, then attempt to
fetch again.

本篇文章回覆於2010-10-14 19:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

Justin

感謝花旗蔘的解釋,我大致瞭解了,我想再請教一個問題確認一下,
是因為我在 p_bbb 有一個 commit,雖然是 p_aaa 呼叫 p_bbb,
但是 p_bbb 裡面執行的 commit 同時也把 p_aaa 裡因 for update 而 lock 住的 cursor 解開,
也就是 p_bbb 的 commit 會同時解開 p_aaa 裡鎖住的 cursor,
導致回到 p_aaa 要再 fetch cursor 時就會錯誤,不知我的理解是否有錯?謝謝!
本篇文章回覆於2010-10-19 12:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

Justin

補充一下,或者我把 p_aaa 中 cursor 的 for update 這一行拿掉,
也可以解決 ORA-01002 的問題,是嗎?
本篇文章回覆於2010-10-19 14:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

花旗蔘

嗯嗯~你把測試的語法run一下就能了解了
本篇文章回覆於2010-10-19 23:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

Youme

各位大大好,小弟也遇到相同的fetch out of sequence的問題
但是我的PROCEDURE裡面沒有下for update的語法,
且也有其它PROCEDURE的格式是一樣的,
也有測試一筆是可以執行,但是兩筆以上就不行了,想請問是否有人可以解答。
謝謝。
本篇文章回覆於2013-07-26 16:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--

   
1




回覆 如要回應,請先登入.


| 網站導覽| 網站介紹 | 4P點數說明 | 電子報 | 小舖活動 | 大事紀 | 廣告刊登 |常見問題 | 聯絡我們 |
 版權所有 ©copyright 2000 All Rights Reserved