трудности с созданием процедуры pl / sql - PullRequest
0 голосов
/ 09 июля 2019

пытается создать процедуру, но я получаю сообщение об ошибке. вот код

create or replace procedure HK.PURGE_LAN_DOTS
AS
batchsize number := 15000;
deleteline timestamp := current_timestamp - 365;
counter number := 0;
BEGIN
  loop
    DELETE FROM LAN.DOTS
    WHERE rownum <= batchsize
    AND TIMESTAMP < deleteline;
    COMMIT;

    counter:=counter + SQL%rowcount;

    exit when batchsize > SQL%rowcount;

  end loop;
  HK.PURGE_LAN_DOTS;
END 

это ошибка, которую я получаю

Ошибка (36,12): PLS-00103: обнаружен символ «.» при ожидании одного из следующих действий:;

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Возможно, просто опечатки. Эта версия должна работать (если HK имеет доступ к LAN.DOTS).

Сценарии PL / SQL обрабатываются не так, как автономный SQL, так как для них требуется конечная точка с запятой, а также косая черта в новой строке.

Семантика слэша и точки с запятой в SQL * Плюс немного странный; вот еще один вопрос, заданный именно об этом: Когда мне нужно использовать точку с запятой или косую черту в Oracle SQL?

Наконец, вы включили HK.PURGE_LAN_DOTS; перед оператором END, когда вы, вероятно, намеревались использовать END PURGE_LAN_DOTS;. Обратите внимание, что вы не можете включить имя схемы в этот закрывающий тег, а именованный закрывающий тег является совершенно необязательным (вы можете использовать только END;).

create or replace procedure HK.PURGE_LAN_DOTS
AS
batchsize number := 15000;
deleteline timestamp := current_timestamp - 365;
counter number := 0;
BEGIN
  loop
    DELETE FROM LAN.DOTS
    WHERE rownum <= batchsize
    AND TIMESTAMP < deleteline;
    COMMIT;

    counter:=counter + SQL%rowcount;

    exit when batchsize > SQL%rowcount;

  end loop;

END PURGE_LAN_DOTS;
/
0 голосов
/ 09 июля 2019

Конец кода, который вы опубликовали, имеет следующий вид:

  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.

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