ORA-00923: 在 oracle 中未找到预期错误的 FROM 关键字

Posted

技术标签:

【中文标题】ORA-00923: 在 oracle 中未找到预期错误的 FROM 关键字【英文标题】:ORA-00923: FROM keyword not found where expected error in oracle 【发布时间】:2014-08-14 09:17:14 【问题描述】:

我在 Oracle 11g 中有以下存储过程。我使用 c# 通过 ASP.net 将表名作为参数传递。但是在运行应用程序时,我收到错误“ORA-00923: FROM keyword not found where expected error in 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;

所以任何人有解决方案请尽快让我知道。提前致谢

【问题讨论】:

你的内部 SELECT 必须有 FROM 另外,Oracle 中既没有 date_add() 也没有 curdate() 函数 【参考方案1】:

您的DELETE 语句中有三个错误:

    Oracle 中没有date_add() 函数 (See the manual for a list of available functions) Oracle 中没有curdate() 函数 (See the manual for a list of available functions) 子查询完全没有必要。另外:select 需要 from 子句。

把它们放在一起,你的删除应该是这样的:

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

(注意字符串文字中重复的单引号)。

请注意,Oracle 的DATE 数据类型总是 包含时间部分。所以sysdate - interval '1' week 将返回一周前的日期为“当前时间”。如果您的意思是包括上周的完整天,则需要使用 trunc:trunc(sysdate) - interval '1' week“删除”时间部分。

【讨论】:

【参考方案2】:

你的内部查询看起来很像:-

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

所以请更正您的查询。

【讨论】:

Oracle 中既没有date_add 也没有curdate() 函数。

以上是关于ORA-00923: 在 oracle 中未找到预期错误的 FROM 关键字的主要内容,如果未能解决你的问题,请参考以下文章

求高手,oracle一直报这个错误:ORA--00923 无法在应该出现from关键字的位置上找到它,如何解决

查询在预期的地方找不到关键字错误 ora-00923

jmeter3.1连接数据库报错,ORA-00923: 未找到要求的 FROM 关键字

在 Oracle SQL 中使用 CTE(ORA-00923:在预期的地方找不到 FROM 关键字)

我将如何修复这些“ORA-00933:SQL 命令未正确结束”“ORA-00923:未在预期位置找到 FROM 关键字”错误?

ORA-00923: 未找到要求的 FROM 关键字