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

/一种可能性是在语句后面的脚本中没有斜杠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;
/
于 2012-02-08T14:23:53.443 回答
2

如果这确实是整个文件,您需要/在 final 之后end;告诉 SQL*Plus(假设这是您用来运行批处理文件的文件)执行该块。如果将其粘贴到 SQL*Plus 命令提示符中,您会看到它正在等待输入,并显示行号提示。

于 2012-02-08T14:20:58.780 回答