Что не так с этим блоком кода PLSQL - PullRequest
1 голос
/ 08 февраля 2012

Приведенный ниже кодовый блок не выполняется при выполнении из пакетного файла.Просто зависает (ничего не происходит).Он сидит там часами.Я не могу отследить, в чем проблема или как ее отладить.Пожалуйста помоги.

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;

Ответы [ 2 ]

5 голосов
/ 08 февраля 2012

Одна из возможностей заключается в том, что в вашем скрипте нет слеша / после оператора 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;
/
2 голосов
/ 08 февраля 2012

Если это действительно весь файл, вам нужно / после последнего end;, чтобы сообщить SQL * Plus (при условии, что вы используете его для запуска пакетного файла) для выполнения блока.Если вы вставили это в командную строку SQL * Plus, вы увидите, что он ожидает ввода, отображая приглашение с номером строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...