DB2:无效使用以下之一:无类型参数标记、DEFAULT 关键字或空值
DB2: invalid use of one of the following: an untyped parameter marker, the DEFAULT keyword, or a null value
用户只能修改 ST_ASSMT_REF 记录中的 ST_ASSMT_NM 和 CAN_DT 列。在我们的系统中,我们将历史保存在相同的 table 中,我们从不真正更新记录,我们只是插入一个新行来表示更新的记录。因此,"active" 记录是 VENDR_ID 具有最大 LAST_TS 时间戳值的记录。为了防止对无法更改的列进行更新的可能性,我编写了逻辑更新,以便它从原始记录中检索不可更改的值并将它们复制到正在创建的新记录中。对于可以修改的字段,我将它们作为参数传递,
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 服务器,我很确定这样做不会有问题,但我不确定如何处理它。
建议?我知道我可以在两个单独的命令中执行此操作,1 个查询 SELECT 以检索原始值,然后将返回值和修改后的值提供给 INSERT 命令,但我应该能够在一个命令中执行此操作。为什么我不能?
正如您在评论中提到的,DB2 对数据类型非常挑剔,它希望您将变量转换为正确的数据类型。即使您传入 NULL,有时 DB2 也希望您将 NULL 转换为目标列的数据类型。
Here 是我对这个话题的另一个回答。
用户只能修改 ST_ASSMT_REF 记录中的 ST_ASSMT_NM 和 CAN_DT 列。在我们的系统中,我们将历史保存在相同的 table 中,我们从不真正更新记录,我们只是插入一个新行来表示更新的记录。因此,"active" 记录是 VENDR_ID 具有最大 LAST_TS 时间戳值的记录。为了防止对无法更改的列进行更新的可能性,我编写了逻辑更新,以便它从原始记录中检索不可更改的值并将它们复制到正在创建的新记录中。对于可以修改的字段,我将它们作为参数传递,
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 服务器,我很确定这样做不会有问题,但我不确定如何处理它。
建议?我知道我可以在两个单独的命令中执行此操作,1 个查询 SELECT 以检索原始值,然后将返回值和修改后的值提供给 INSERT 命令,但我应该能够在一个命令中执行此操作。为什么我不能?
正如您在评论中提到的,DB2 对数据类型非常挑剔,它希望您将变量转换为正确的数据类型。即使您传入 NULL,有时 DB2 也希望您将 NULL 转换为目标列的数据类型。
Here 是我对这个话题的另一个回答。