You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:12:19