用户只能修改ST_ASSMT_REF记录中的ST_ASSMT_NM和CAN_DT列。在我们的系统中,我们将历史记录保存在同一个表中,我们从未真正更新过记录,我们只需插入一个新行来表示更新的记录。因此,“活动”记录是具有VENDR_ID的最大LAST_TS时间戳值的记录。为了防止更新无法更改的列的可能性,我编写了逻辑UPDATE,以便从原始记录中检索不可更改的值,并将它们复制到正在创建的新值中。对于可以修改的字段,我将它们作为参数传递,
INSERT INTO GSAS.ST_ASSMT_REF
(
VENDR_ID
,ST_ASSMT_NM
,ST_CD
,EFF_DT
,CAN_DT
,LAST_TS
,LAST_OPER_ID
)
SELECT
ORIG_ST_ASSMT_REF.VENDR_ID
,@ST_ASSMT_NM
,ORIG_ST_ASSMT_REF.ST_CD
,ORIG_ST_ASSMT_REF.EFF_DT
,@CAN_DT
,CURRENT TIMESTAMP
,@LAST_OPER_ID
FROM
(
SELECT
ST_ASSMT_REF_ACTIVE_V.VENDR_ID
,ST_ASSMT_REF_ACTIVE_V.ST_ASSMT_NM
,ST_ASSMT_REF_ACTIVE_V.ST_CD
,ST_ASSMT_REF_ACTIVE_V.EFF_DT
,ST_ASSMT_REF_ACTIVE_V.CAN_DT
,CURRENT TIMESTAMP
,ST_ASSMT_REF_ACTIVE_V.LAST_OPER_ID
FROM
G2YF.ST_ASSMT_REF_ACTIVE_V ST_ASSMT_REF_ACTIVE_V --The view of only the most recent, active records
WHERE
ST_ASSMT_REF_ACTIVE_V.VENDR_ID = @VENDR_ID
) ORIG_ST_ASSMT_REF;
但是,我收到此错误:
DB2 SP
:
ERROR [42610] [IBM][DB2] SQL0418N The statement was not processed because the statement contains an invalid use of one of the following: an untyped parameter marker, the DEFAULT keyword, or a null value.
似乎DB2不允许我在SELECT语句中使用变量。例如,当我在TOAD for DB2中执行此操作时:
select 1, @vendorId from SYSIBM.SYSDUMMY1
我得到一个弹出对话框。当我提供任何字符串值时,我得到相同的错误。
我通常使用SQL Server,我很确定我不会有这样的问题,但我不知道如何处理它。
连连呢?我知道我可以在两个单独的命令中执行此操作,1查询SELECT以检索原始VALUES,然后将返回的值和修改后的值提供给INSERT命令,但我应该能够在一个中执行thios。为什么我不能?
答案 0 :(得分:1)
正如您在评论中提到的,DB2对数据类型非常挑剔,它希望您将变量转换为正确的数据类型。即使您传入NULL,有时DB2也希望您将NULL转换为目标列的数据类型。
Here是我对该主题的另一个答案。