【问题标题】:ORA-00923: FROM keyword not found where expected error in oracleORA-00923: 在 oracle 中未找到预期错误的 FROM 关键字
【发布时间】: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() 函数

标签: oracle ora-00923


【解决方案1】:

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

  1. Oracle 中没有date_add() 函数 (See the manual for a list of available functions)
  2. Oracle 中没有curdate() 函数 (See the manual for a list of available functions)
  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“删除”时间部分。

【讨论】:

    【解决方案2】:

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

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

    所以请更正您的查询。

    【讨论】:

    • Oracle 中既没有date_add 也没有curdate() 函数。
    猜你喜欢
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多