从批处理文件执行时,下面的代码块没有运行。它只是挂起(没有任何反应)。它坐在那里几个小时。我无法跟踪问题是什么或如何调试它。请帮忙。
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 :(得分: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;
/
答案 1 :(得分:2)
如果这确实是整个文件,那么在最终/
后需要end;
告诉SQL * Plus(假设您正在使用它来运行批处理文件)来执行该块。如果您将其粘贴到SQL * Plus命令提示符中,您将看到它等待输入,显示行号提示。