IBM i DB2存储过程部署报SQL0029缺少INTO子句问题排查
问题更新
我已找到问题答案,将对示例代码进行修正,感谢所有尝试帮助我的朋友。
问题描述
以下测试脚本在「Run SQL Scripts」工具及在线SQL语法检查工具中均可正常通过校验,但使用IBM Data Studio将其部署为IBM i平台DB2数据库的存储过程时,会抛出 [SQL0029] INTO clause missing from embedded statement 错误。检索大量相关资料后未找到有效解决方案,现将代码贴出求排查写法问题。
CREATE PROCEDURE uspTotTripsCreatByAgtMoYr ( IN pForMonth NUMERIC(2), IN pForYear NUMERIC(4) ) RESULT SETS 1 LANGUAGE SQL P1: BEGIN -- 定义临时表 DECLARE GLOBAL TEMPORARY TABLE SESSION.tmpTTBA ( UID CHAR(8) NOT NULL, NUMTRPCREATED NUMERIC(6) NOT NULL, ENDATEYR NUMERIC(4) NOT NULL, ENDATEMO NUMERIC(2) NOT NULL, DIVCODE CHAR(2) DEFAULT 'ZZ' ) WITH REPLACE ON COMMIT PRESERVE ROWS; -- 概念验证逻辑 INSERT INTO SESSION.tmpTTBA (UID, NUMTRPCREATED, ENDATEYR, ENDATEMO) SELECT TM."RecordEntryUserID", COUNT(TM."TripNumber"), TM."RecordEntryDateYear", TM."RecordEntryDateMonth" FROM FXDTAZZ."TripMaster" "TM" GROUP BY TM."RecordEntryUserID", TM."RecordEntryDateYear", TM."RecordEntryDateMonth" HAVING (TM."RecordEntryDateYear" = pForYear) AND (TM."RecordEntryDateMonth" = pForMonth); -- 概念验证结果检查 -- 注意:直接写 SELECT * FROM SESSION.tmpTTBA; 就是触发SQL0029错误的根因 -- 正确写法需要将查询包裹在独立的BEGIN...END块中,同时声明并打开绑定的游标 BEGIN DECLARE c_tmp CURSOR WITH RETURN TO CLIENT FOR -- 返回临时表所有行 SELECT * FROM SESSION.tmpTTBA; OPEN c_tmp; END; -- 后续所有schema的聚合逻辑从这里开始编写 -- 从FXDTAAA开始循环遍历到FXDTAZZ即可 -- 资源清理 DROP TABLE SESSION.tmpTTBA; END P1
问题根因
- 直接在存储过程中裸写未绑定游标的
SELECT语句是触发报错的核心原因 - DB2嵌入式SQL返回结果集有固定写法要求:必须将返回结果的
SELECT语句包裹在独立的BEGIN...END块中,同时声明绑定该查询的游标,设置游标为WITH RETURN TO CLIENT后打开游标,才能正常向客户端返回结果集
内容的提问来源于stack exchange,提问作者GCDevOps
相关产品推荐
相关产品推荐

