我正在使用下面的语句来更新/插入一些数据到表中,如果我在没有参数的情况下运行它,那很好。但是,只要我尝试使用参数执行它就会抛出:
SQL0418N - 语句包含使用无类型参数标记,DEFAULT关键字或无效的空值。
我已阅读错误信息here,但我仍在努力解决为什么我的陈述不会执行。
--This statement works
MERGE Into AB.Testing_Table A
USING (VALUES('TEST', 'P')) B(TEST_ID, "ACTION")
ON (A.TEST_ID = B.TEST_ID)
WHEN NOT MATCHED THEN
INSERT (TEST_ID, "ACTION")
VALUES ('TEST', 'P')
WHEN MATCHED THEN
UPDATE SET TEST_ID = 'TEST'
,"ACTION" = 'P';
--This statement fails with error SQL0418N
MERGE Into AB.Testing_Table A
USING (VALUES(@TEST, @ACTION)) B(TEST_ID, "ACTION")
ON (A.TEST_ID = B.TEST_ID)
WHEN NOT MATCHED THEN
INSERT (TEST_ID, "ACTION")
VALUES (@TEST, @ACTION)
WHEN MATCHED THEN
UPDATE SET TEST_ID = @Test
,"ACTION" = @Action;
提前感谢您的帮助!
答案 0 :(得分:12)
基本上,DB2不知道您在这些参数上发送的数据类型。我猜你要么是旧版本的DB2(在Linux / Unix / Windows上低于9.7,或者在早于10.1的大型机版本上),它不会进行大量的“自动”类型转换。或者你发送NULL
值(仍然必须“输入”,听起来很奇怪)。
您可以通过将参数标记创建为类型化参数来解决问题(我假设数据类型在这里,使用适当的方法):
MERGE INTO AB.TESTING_TABLE A
USING (VALUES (
CAST(@TEST AS CHAR(4))
,CAST(@ACTION AS CHAR(1))
)) B(TEST_ID, "ACTION")
ON (A.TEST_ID = B.TEST_ID)
WHEN NOT MATCHED THEN
INSERT (TEST_ID, "ACTION")
VALUES (B.TEST_ID, B.ACTION)
WHEN MATCHED THEN
UPDATE SET "ACTION" = B.ACTION
此外,由于您使用的是MERGE
,因此您不必使用UPDATE
或INSERT
部分中的参数,您可以参考{{USING
中的值您传入的表格。此外,由于您在TEST_ID
上匹配,因此您无需在UPDATE
语句中包含该表,因为它无论如何都不会更新。 / p>