DB2 10.5.x存储过程中FETCH FIRST N ROWS ONLY无法使用问题咨询
DB2 10.5.x存储过程中DELETE语句使用FETCH FIRST子句报错问题解答
这不是DB2 10.5.x的bug,而是版本间的语法支持差异导致的:
- DB2 10.5.x的SQL语法规范里,仅SELECT语句支持FETCH FIRST子句,DELETE、UPDATE这类数据修改语句并不支持该子句。所以在存储过程的DELETE后添加FETCH FIRST会触发SQL0104N语法错误(提示意外令牌)。
- DB2 11.x版本开始扩展了语法支持,允许在DELETE、UPDATE语句中使用FETCH FIRST来限制操作的行数,因此该存储过程在11.x中可以正常运行。
如果需要在DB2 10.5.x的存储过程中实现“删除指定行数符合条件的数据”的需求,可以采用间接方式实现:
- 先通过SELECT语句筛选出符合条件的前N行的唯一标识(如主键),存入临时表;
- 基于临时表中的标识执行DELETE操作。
示例代码如下:
CREATE OR REPLACE PROCEDURE sampleStoredProc() BEGIN -- 创建会话级临时表存储待删除行的主键 DECLARE GLOBAL TEMPORARY TABLE SESSION.TODELETE ( table_pk INT -- 替换为实际表的主键字段及类型 ) WITH REPLACE NOT LOGGED; -- 插入符合条件的前10行主键 INSERT INTO SESSION.TODELETE SELECT table_pk 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; -- 根据主键删除目标行 DELETE FROM <table> WHERE table_pk IN (SELECT table_pk FROM SESSION.TODELETE); END
内容的提问来源于stack exchange,提问作者Sunil Ranahandola
相关产品推荐
相关产品推荐

