【问题标题】:DB2 "FETCH FIRST N ROWS ONLY" does not work in a db2 stored procedureDB2 \"FETCH FIRST N ROWS ONLY\" 在 db2 存储过程中不起作用
【发布时间】:2022-08-17 18:08:00
【问题描述】:

DB2 版本:10.5.x
以下查询工作正常:
db2 \"SELECT * FROM <table> FETCH FIRST 10 ROWS ONLY\"

但是当我在 db2 存储过程中使用相同的语句时,它会抛出错误
db2 \"CREATE OR REPLACE PROCEDURE sampleStoredProc() BEGIN DELETE FROM <table> WHERE TIMESTAMP(\'1970-01-01 \',\'00:00:00 \') + CAST ( SUBSTR(TIMESTAMP, 1, 10) AS INTEGER ) SECONDS < (CURRENT DATE - 90 DAYS) FETCH FIRST 10 ROWS ONLY ;
来自 DB2 的错误:
DB21034E 该命令被作为 SQL 语句处理,因为它不是 有效的命令行处理器命令。在 SQL 处理期间,它返回: SQL0104N 在 \"RENT 之后发现了意外的标记 \"FETCH 2 ROW ONLY\" DATE - 90 DAYS)\"。预期的标记可能包括:\"<\\space>\"。LINE NUMBER=1。 SQLSTATE=42601

如果我删除 FETCH FIRST 10 ROWS ONLY 行,那么它工作正常。此外,上述存储过程在 db2 11.x 中也能正常工作。那么,DB2 10.5.x 中是否存在一些不允许我创建存储过程的错误?

  • 版本之间的 SQL 语法变化! Db2-LUW v10.5 DELETE 语法不允许 fetch-clause,而 Db2-LUW v11.x DELETE 语法允许它。您将需要更改 Db2-LUW v10.5 的查询。

标签: db2


【解决方案1】:

V10.5 DELETE 语句不允许 FETCH FIRST 子句,但 V11.1 DELETE 确实允许它。
您可以在 Db2 10.5 中使用以下语法:

DELETE FROM 
(
  SELECT 1
  FROM <table> 
  WHERE 
       TIMESTAMP ('1970-01-01 ', '00:00:00') 
     + CAST (SUBSTR(TIMESTAMP, 1, 10) AS INTEGER) SECONDS
     < (CURRENT DATE - 90 DAYS)
  FETCH FIRST 10 ROWS ONLY
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多