【问题标题】:Procedure in DB2 - SQL Error [42601]: [SQL0199] Keyword FROM not expected. Valid tokens: USE SKIP WAIT WITH WHEREDB2 中的过程 - SQL 错误 [42601]:[SQL0199] 关键字 FROM 不是预期的。有效令牌:使用 SKIP WAIT WITH WHERE
【发布时间】:2018-10-05 07:12:02
【问题描述】:

您好,我正在尝试编写一个 DB2 过程,这在 SQL Server 中是一项简单的任务,但在 DB2 中似乎非常困难

脚本:

CREATE PROCEDURE TT.PURGE_LOGS ()
  LANGUAGE SQL  
  SPECIFIC atomic_proc   
  ap:  BEGIN ATOMIC            
     DELETE FROM TT.DTL
     WHERE LOGID IN 
     (SELECT LOGID FROM TT.HDR
     WHERE LOGTYPE <> 120 AND CRDATE < CURRENT_DATE - 30 DAY FROM sysibm.sysdummy1); 
     SIGNAL SQLSTATE '70000';        
     DELETE LOGID FROM TT.HDR
     WHERE LOGTYPE <> 120 AND CRDATE < CURRENT_DATE - 30 DAY FROM sysibm.sysdummy1; 

结束应用

错误: SQL 错误 [42601]:[SQL0199] 关键字 FROM 不是预期的。有效令牌:使用 SKIP WAIT WITH WHERE

任何想法我哪里出错了?

【问题讨论】:

  • SELECT LOGID FROM TT.HDR WHERE LOGTYPE &lt;&gt; 120 AND CRDATE &lt; CURRENT_DATE - 30 DAY FROM sysibm.sysdummy1 看起来不像一个有效的子选择;一方面,它似乎有两个FROM 子句。

标签: db2 procedure


【解决方案1】:

正如 mustaccio 在评论中已经建议的那样,您的语法无效。

如果 CRDATE 的数据类型是 DATE 那么你的意思是:

CREATE or replace PROCEDURE TT.PURGE_LOGS ()
  LANGUAGE SQL  
  SPECIFIC atomic_proc   
  ap:  
  BEGIN ATOMIC            
     DELETE FROM TT.DTL
     WHERE LOGID IN 
                    (SELECT LOGID 
                     FROM TT.HDR
                     WHERE LOGTYPE <> 120 
                     AND CRDATE < CURRENT_DATE - 30 DAYS
                    ) ;
     DELETE FROM TT.HDR
     WHERE LOGTYPE <> 120 
     AND CRDATE < CURRENT DATE - 30 DAYS
     ;

END ap

请注意,您的 SIGNAL SQLSTATE 可能应该在异常处理程序中,否则在您编写它时它的用途并不明确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多