2012-02-08 9 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

答えて

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

2

それは本当にあなたがブロックを実行するために(それはあなたがバッチファイルを実行するために使用しているものだと仮定して)SQL * Plusのを伝えるために、最終的なend;/を必要とするファイル全体である場合。 SQL * Plusのコマンド・プロンプトに貼り付けた場合は、入力待ちの行番号プロンプトが表示されます。

+0

おかげさまで、ありがとうございます。 – Ram

+0

バッチファイルで使用できるSQL * Plus以外は何ですか? – user272735

+1

@ user272735 - 'plsqldeveloper'でタグ付けされましたが、私はそれを使用していないので、ファイルからコマンドを実行するオプションがあるのか​​、誤ってタグ付けされているのか分かりません。私は、外部の.sqlファイルに無名ブロックを置き、.batまたはシェルスクリプトを参照する 'batch'ではなく 'sqlplus [-s] @ file.sql'またはそれと同様の方法で実行していました。それはここで少し曖昧だと思う。 –

関連する問題