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

DB2存储过程中使用WITH子句INSERT时添加TEMP_3块遇SQLCODE=-789错误

问题

存储过程中执行以下代码时,只要不包含TEMP_3块就能正常运行,添加后触发错误:
参数或SQL变量'WITH TEMP AS ( SELECT * FROM TABLEE'的数据类型在例程、复合SQL语句或游标值构造函数的参数列表中不受支持。SQLCODE=-789, SQLSTATE=429BB, DRIVER=4.28.11

原代码

DECLARE C1 CURSOR FOR S1;
'WITH TEMP AS (
        SELECT *
        FROM TABLEE 
        WHERE ID = 2
        )), 
        TEMP_1 AS (
        SELECT COUNT(1) AS ID FROM NEW TABLE (
        INSERT INTO TABLE_A (Col_1, Col_2)
        SELECT Col_1, 'A'
        FROM TABLE_A
        JOIN TABLEE ON ID = Col_1
        )),
        TEMP_2 AS (
        SELECT COUNT(1) AS ID FROM NEW TABLE (
        INSERT INTO TABLE_B (Col_1, Col_2)
        SELECT Col_1, 'B'
        FROM TABLE_B
        JOIN TABLEE ON ID = Col_1
        )),
        TEMP_3 AS (
        SELECT COUNT(1) AS ID FROM NEW TABLE (
        INSERT INTO TABLE_C (Col_1, Col_2)
        SELECT Col_1, 'C'
        FROM TABLE_C
        JOIN TABLEE ON ID = Col_1
        )),
        SELECT 1
        FROM SYSIBM.SYSDUMMY1';
  OPEN C1;
  CLOSE C1;

问题原因与修复

报错根源是CTE(公共表表达式)的语法错误:

  • TEMP块结尾多了一个右括号:原代码里的))需改为)
  • TEMP_3块结尾多余逗号,主查询SELECT 1 ...前不能保留逗号

另外原代码存在逻辑疏漏——DECLARE C1 CURSOR FOR S1中的S1未定义,需先通过PREPARE语句将动态SQL字符串绑定到S1,再声明游标。同时动态SQL内的单引号需要转义(用两个单引号替代一个)。

修正后的完整代码示例:

-- 准备动态SQL语句
PREPARE S1 FROM '
WITH TEMP AS (
        SELECT *
        FROM TABLEE 
        WHERE ID = 2
        ), 
        TEMP_1 AS (
        SELECT COUNT(1) AS ID FROM NEW TABLE (
        INSERT INTO TABLE_A (Col_1, Col_2)
        SELECT Col_1, ''A''
        FROM TABLE_A
        JOIN TABLEE ON ID = Col_1
        )),
        TEMP_2 AS (
        SELECT COUNT(1) AS ID FROM NEW TABLE (
        INSERT INTO TABLE_B (Col_1, Col_2)
        SELECT Col_1, ''B''
        FROM TABLE_B
        JOIN TABLEE ON ID = Col_1
        )),
        TEMP_3 AS (
        SELECT COUNT(1) AS ID FROM NEW TABLE (
        INSERT INTO TABLE_C (Col_1, Col_2)
        SELECT Col_1, ''C''
        FROM TABLE_C
        JOIN TABLEE ON ID = Col_1
        )
        SELECT 1
        FROM SYSIBM.SYSDUMMY1';

-- 声明并操作游标
DECLARE C1 CURSOR FOR S1;
OPEN C1;
CLOSE C1;

内容的提问来源于stack exchange,提问作者mastermistik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:20:15