Db2从jdbc与动态值合并

时间:2012-02-15 13:49:39

标签: java sql jdbc merge db2

我想使用db2 merge语句将其作为jdbc的语句提交。 我在以下场景中。我正在使用专有的持久层,我正在处理一个我不知道它是否已经存在的实体,我想使用merge语句来插入或更新数据库中的行。 可能吗? 假设我正在使用表并使用三列: id,name,surname ,我正在处理id =“5”的实体,name =“chuck “,surname =”norris“我能发出:

MERGE INTO people AS t
  USING (select '5' as id, 'chuck' as name, 'norris' as surname from SYSIBM.SYSDUMMY1)As s
    ON (t.id = s.id)
  WHEN MATCHED THEN 
      UPDATE SET t.name=s.name, t.surmane=s.surname
  WHEN NOT MATCHED THEN
    INSERT
      (id, name, surname)
    VALUES (s.id, s.name, s.surname)
这样的声明?我试图这样做,但我收到了一个错误。我不认为在 USING 之后允许使用选择:

USING (select '5' as id, 'chuck' as name, 'norris' as surname from SYSIBM.SYSDUMMY1)As s

我也试着这样做:

USING VALUES('5','chuck','norris') AS s(id,chuck,norris)

但它不起作用。任何帮助,将不胜感激。 此外,是否有人知道是否可以在准备好的声明中使用这样的声明,用'?'替换USING部分中表达的实际值占位符是为了使用setXXX()方法将它们设置为预准备语句?

由于

由于 费尔

1 个答案:

答案 0 :(得分:5)

假设您正在使用DB2 Linux / Unix / Windows(LUW),您的数据的MERGE语法将是这样的。 VALUES子句在里面用于USING部分的括号。

此外,如果您使用的是LUW,则无法在LUW 9.5或更低版本中动态准备MERGE(I.E.,您的查询不能包含参数标记)。这是在LUW 9.7中添加的。

MERGE INTO people AS t USING (
      VALUES (5, 'Chuck', 'Norris'),
             (6, 'John', 'Smith'),
             (7, 'Abraham', 'Lincoln')
             -- maybe more rows
    ) AS s (id, name, surname)
    ON t.id = s.id
    WHEN MATCHED THEN
        UPDATE SET t.name=s.name, t.surname=s.surname
    WHEN NOT MATCHED THEN
        INSERT (id, name, surname)
                VALUES (s.id, s.name, s.surname)

但是,您对全查询的实际问题可能是您的查询中存在一些拼写错误...例如UPDATE SET t.name=s.name, t.surmane=s.surname中的“surmane”