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
заявление:
- здесь нет
date_add()
функция в Oracle ( список доступных функций см. в руководстве) - здесь нет
curdate()
функция в Oracle ( список доступных функций см. в руководстве) - Подзапрос совершенно не нужен. Плюс:
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;
Так что, пожалуйста, исправьте ваш запрос.