IBM DB2 SQL动态复制表记录并修改三位年份主键的方案咨询
复制行并修改主键的实现方案(适配Db2 for i + RPGLE场景)
1. 测试阶段静态写法
你之前的错误写法核心问题是将新行的主键条件错放在INSERT子句后,正确的逻辑是在SELECT阶段就将主键替换为目标新值,示例(目标新主键为222):
INSERT INTO 你的表名 SELECT 222 AS PK, * EXCLUDE (PK) FROM 你的表名 WHERE PK = 999;
*注:* EXCLUDE (PK) 是Db2 for i支持的语法,作用是选取除PK外的所有字段,不需要手动枚举所有列,如果你用的其他数据库可以手动列出所有非主键字段代替。
2. 生产动态通用方案(适配多表,支持RPGLE调用)
要支持多表复用,可以封装为通用存储过程,示例代码如下:
CREATE OR REPLACE PROCEDURE COPY_ROW_WITH_NEW_PK ( IN TABLE_NAME VARCHAR(128), IN SOURCE_PK DEC(3,0), IN NEW_PK DEC(3,0) ) LANGUAGE SQL MODIFIES SQL DATA BEGIN DECLARE SQL_STMT VARCHAR(1000); -- 可自行增加校验逻辑:比如表是否存在、新主键是否已存在、主键是否为3位数字,避免非法操作 SET SQL_STMT = 'INSERT INTO ' || TABLE_NAME || ' SELECT ' || NEW_PK || ', * EXCLUDE (PK) FROM ' || TABLE_NAME || ' WHERE PK = ' || SOURCE_PK; EXECUTE IMMEDIATE SQL_STMT; END
如果你的不同表主键字段名不统一,可以额外加一个PK_COL_NAME的入参替换逻辑里的硬编码PK即可。
3. RPGLE调用方式
直接在RPGLE代码中调用存储过程即可,示例:
EXEC SQL CALL COPY_ROW_WITH_NEW_PK('YOUR_TABLE', 999, 222);
如果不想单独创建存储过程,也可以直接在RPGLE中拼接动态SQL执行,逻辑和上面存储过程的拼接逻辑一致。
内容的提问来源于stack exchange,提问作者Zlimca
相关产品推荐
相关产品推荐

