DB2:无效使用以下之一:无类型参数标记,DEFAULT关键字或空值

时间:2016-06-10 19:27:30

标签: db2 zos

用户只能修改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。为什么我不能?

1 个答案:

答案 0 :(得分:1)

正如您在评论中提到的,DB2对数据类型非常挑剔,它希望您将变量转换为正确的数据类型。即使您传入NULL,有时DB2也希望您将NULL转换为目标列的数据类型。

Here是我对该主题的另一个答案。