1

以下のコードブロックは、バッチファイルから実行すると実行されません。ハングするだけです(何も起こりません)。それは何時間もそこに座っています。問題が何であるか、またはこれをデバッグする方法を追跡できません。助けてください。

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;
4

2 に答える 2

5

/1つの可能性は、ステートメントの後にスクリプトにスラッシュがないことですend;。これにより、SQLPlusにブロックを実行するように指示されます。単にend;何も続かなかった場合、SQLPlusは決して取得しない入力を待機している可能性があります。

それとは別にV$SESSION_WAIT、ブロックの実行中にdbaを調べて、セッションが何を待機しているかを確認することをお勧めします。

さらに、次のような書き直しを試みることもできます。これは、より効率的だと思います。

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;
/
于 2012-02-08T14:23:53.443 に答える
2

それが本当にファイル全体である場合は/、ファイナルの後に、end;SQL * Plusにブロックを実行するように指示する必要があります(これがバッチファイルの実行に使用していると仮定します)。これをSQL*Plusコマンドプロンプトに貼り付けると、入力を待機していることがわかり、行番号プロンプトが表示されます。

于 2012-02-08T14:20:58.780 に答える