ORA-00923: ключевое слово FROM не найдено там, где ожидаемая ошибка в Oracle

У меня есть следующая процедура Store в Oracle 11g. Я передаю имя таблицы в качестве параметра через ASP.net, используя C#. Но во время работы приложения я получаю сообщение об ошибке "ORA-00923: ключевое слово FROM не найдено там, где ожидается ошибка в Oracle".

PROCEDURE "ARCHIVE_FILTERDATA" ( ITYPE IN VARCHAR2, itableName IN VARCHAR2, cur_archive OUT sys_refcursor ) AS 

stmt clob; 

endstmt clob; 

BEGIN

IF ITYPE='Week' 
THEN stmt := 'DELETE FROM '|| itableName ||' WHERE CREATEDATE < (SELECT DATE_ADD(CURDATE(), INTERVAL , - 1, WEEK))'; 
EXECUTE IMMEDIATE stmt; 

END IF;

END;

Так что у кого-нибудь есть решение, пожалуйста, дайте мне знать как можно скорее. Заранее спасибо

2 ответа

У вас есть три ошибки в вашем DELETE заявление:

  1. здесь нет date_add() функция в Oracle ( список доступных функций см. в руководстве)
  2. здесь нет curdate() функция в Oracle ( список доступных функций см. в руководстве)
  3. Подзапрос совершенно не нужен. Плюс: select требует from пункт.

Собрав все вместе, ваше удаление должно выглядеть так:

stmt := 'DELETE FROM '|| itableName ||' WHERE CREATEDATE < sysdate - interval ''1'' week'; 

(Обратите внимание на одинарные кавычки внутри строкового литерала).

Помните, что Oracle DATE Тип данных всегда содержит часть времени. Так sysdate - interval '1' week вернет дату недели назад в "текущее время". Если вы хотите включить полный день на прошлой неделе, вам нужно "удалить" часть времени, используя trunc: trunc(sysdate) - interval '1' week,

Ваш внутренний запрос будет выглядеть так:

SELECT DATE_ADD(CURDATE(), INTERVAL , - 1, WEEK) FROM DUAL;

Так что, пожалуйста, исправьте ваш запрос.

Другие вопросы по тегам