2012-02-08 63 views
1

從批處理文件執行時,下面的代碼塊沒有運行。它只是掛起(沒有任何反應)。它坐在那裏幾個小時。我無法跟蹤問題是什麼或如何調試。請幫忙。這個PLSQL代碼塊有什麼問題

declare 
v_personrefid varchar2(50); 
v_hiredt date; 
v_loaddt date; 
v_personid number; 
v1_personrefid varchar2(50); 
v_seq number :=0; 

cursor get_row is 
select distinct personrefid from ARCHIVE_PERSON; 

cursor get_row1 is 
select 
personrefid, 
hiredt, 
loaddt, 
personid 
from 
ARCHIVE_PERSON 
where 
personrefid = v_personrefid 
order by hiredt, loaddt; 

begin 

v_seq:=0; 
open Get_row; 
loop 
fetch get_row into v_personrefid ; 
exit when get_row%notfound; 

begin 

open get_row1; 
loop 
fetch get_row1 into v1_personrefid, v_hiredt, v_loaddt, v_personid; 
exit when get_row1%NOTFOUND; 

v_seq:= v_seq+1; 

update ARCHIVE_PERSON 
set version = v_seq 
where 
personrefid = v1_personrefid and 
personid = v_personid and 
hiredt = v_hiredt and 
loaddt = v_loaddt; 

commit; 
end loop; 

v_seq:=0; 

close get_row1; 
end; 
end loop; 
v_seq:=0; 
close get_row; 

end; 
+0

也許還嘗試創建一個日誌表,做好沿途刀片(自治區)。做這個習慣。比猜測好得多,你會知道你在處理中的位置。搜索SO這個例子 – tbone 2012-02-08 16:04:58

回答

5

其中一種可能性是,您的腳本中沒有斜槓/,後面跟着end;語句,它會告訴SQLPlus執行該塊。如果你只是簡單地有end;,那麼SQLPlus可能會等待更多的輸入,它永遠不會得到。

除此之外,我建議讓你的dba看看V$SESSION_WAIT,而該塊正在運行,以查看你的會話正在等待什麼。

此外,你可以嘗試類似下面的重寫,我想會更有效率:

DECLARE 
    CURSOR my_cur IS 
    SELECT ROW_NUMBER() OVER (PARTITION BY personrefid ORDER BY hiredt, loaddt) seq 
     FROM archive_person 
     FOR UPDATE; 
BEGIN 
    FOR my_rec IN my_cur LOOP 
    UPDATE archive_person SET version = my_rec.seq 
     WHERE CURRENT OF my_cur; 
    END LOOP; 
END; 
/
+0

在工作結束後添加/。我也將添加優化。謝謝你的幫助。 – Ram 2012-02-08 14:49:25

2

如果這真的是你需要一個/最終end;後告訴的SQL * Plus(假設這是你正在使用運行批處理文件什麼的)執行塊整個文件。如果將它粘貼到SQL * Plus命令提示符中,您會看到它正在等待輸入,並顯示行號提示。

+0

感謝您的幫助。 – Ram 2012-02-08 14:49:37

+0

除了可以在批處理文件中使用的SQL * Plus以外還有什麼? – user272735 2012-02-09 08:46:48

+1

@ user272735 - 它被標記爲'plsqldeveloper',我沒有使用過它,所以不知道它是否有從文件運行命令或被錯誤標記的選項。我認爲在外部.sql文件中使用匿名塊並使用'sqlplus [-s] @ file.sql'或類似文件運行它,而不是引用.bat或shell腳本的'batch';認爲這裏有點含糊不清。 – 2012-02-09 09:02:31