Конец кода, который вы опубликовали, имеет следующий вид:
end loop;
HK.PURGE_LAN_DOTS;
END
В END
отсутствует точка с запятой;но предыдущая строка вызывает эту процедуру, которая вызовет бесконечную рекурсию (которую Oracle в конечном итоге убьет).
Я думаю, что вы испортили это во время публикации, и у вас действительно есть:
end loop;
END HK.PURGE_LAN_DOTS;
и теперь ошибка имеет смысл (хотя строки отчета и номера столбцов не совсем).
Хотя оператор create принимает необязательный префикс схемы:
create or replace procedure HK.PURGE_LAN_DOTS
соответствия END
нет.Общее утверждение можно рассматривать как сочетание SQL и PL / SQL - не в той же степени, что и триггер, но здесь эффект аналогичен.Оператор действительно делает несколько вещей - он создает объект типа процедуры с именем PURGE_LAN_DOTS
в этой схеме, компилирует и сохраняет часть кода PL / SQL с тем же именем.Бит HK.
не является частью имени объекта и не относится к движку PL / SQL - а END
- это чистый PL / SQL.Если вы посмотрите на представление all_source
, то увидите, что сохраненный источник будет PROCEDURE PURGE_LAN_DOTS AS ...
без префикса create or replace
или HK.
- хотя для владельца будет установлено значение HK
.
Таким образом, END
должен ссылаться только на имя объекта PL / SQL и не может иметь префикс схемы:
create or replace procedure HK.PURGE_LAN_DOTS
...
end loop;
END PURGE_LAN_DOTS;
Не связано, но:
deleteline timestamp := current_timestamp - 365;
приведет к преобразованию значения current_timestamp
в дату, на которую будет вычтено 365 дней, и затем будет преобразовано обратно в метку времени;что больше конверсии, чем необходимо, и теряет доли секунды.Вы, вероятно, на самом деле не заботитесь об этом в этом сценарии, но иногда это имеет значение.Чтобы избежать обоих, вы можете сделать одно из следующих действий:
deleteline timestamp := current_timestamp - interval '365' day;
deleteline timestamp := current_timestamp - 365 * interval '1' day;
Как только вы переключитесь на интервал, у вас может возникнуть желание изменить это значение на current_timestamp - interval '1' year
, но это приведет к ошибке в ORA-01839, если вы запустите его29 февраля ...
Также убедитесь, что вы действительно хотите current_timestamp
, а не systimestamp
.