2012-02-15 8 views
4

jdbcからの文としてサブミットするdb2 merge文を使用したいと思います。 私は以下のシナリオにあります。私は独自のパーシスタンス層で作業しています。すでに永続化されているかどうかわからないエンティティを処理しています。データベースの行を挿入または更新するためにmerge文を使用したいと考えています。 可能ですか? テーブルの人の3つのカラム:id、name、surnameとid = "5"、name = "chuck"、surname = "norris"のエンティティを処理しているとします。発行できる:Db2とjdbcとの動的値のマージ

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 (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) 

が、それは仕事をdosn't。どんな助けもありがとう。 さらに、用意されたステートメントでそのようなステートメントを使用することができるかどうかを知っている人は誰でも、USING部分に表現された実際の値を '?'プレースホルダをsetXXX()メソッドを使用してプリペアドステートメントに設定するには?

おかげ

おかげ フィル

答えて

5

は、あなたのデータのためのMERGEの構文を使用すると、DB2のLinux/UNIX/Windowsの(LUW)を使用していると仮定すると、このようなものになるだろう。 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

+1

おかげでたくさんの例のための「surmane」!それはうまくいきました...明らかに括弧で囲まれた問題がありました...正しいUSINGはあなたが書いたものでした! :) – filmac

関連する問題