- PR -

ORACLEのMERGE分

1
投稿者投稿内容
jai
会議室デビュー日: 2007/01/24
投稿数: 16
投稿日時: 2007-01-29 10:27
オラクル9iで以下のMERGE文が
データがあれば更新されますが、なければ登録されないです。

調査しても原因がわかりませんでした。
原因がわかる人いますか?

SQLが悪いのか何が悪いのかまったく不明の状態に陥っています。

MERGE INTO TBL TA
USING DUAL ON (TA.A = '1'
AND TA.B = '2'
AND TA.C = 3
AND TA.D = 4
AND TA.E = '5'
AND TA.F = 6
AND TA.G = '7')
WHEN MATCHED THEN
UPDATE SET TA.H = 8,
TA.M = SYSDATE,
TA.N = '13',
TA.O = '14',
TA.P = TA.L + 1
WHEN NOT MATCHED THEN
INSERT(TA.A,
TA.B,
TA.C,
TA.D,
TA.E,
TA.F,
TA.G,
TA.H,
TA.I,
TA.J,
TA.K,
TA.L,
TA.M,
TA.N,
TA.O,
TA.P)
VALUES('1',
'2',
3,
4,
'5',
6,
'7',
8,
'9',
SYSDATE,
'11',
'12',
SYSDATE,
'13',
'14',
1)
未記入
大ベテラン
会議室デビュー日: 2006/12/15
投稿数: 157
投稿日時: 2007-02-01 11:29
遅レスですけど以下の部分を変更して試してみてもらえますか?
修正前
----------------------------------
MERGE INTO TBL TA
USING DUAL ON (TA.A = '1'
AND TA.B = '2'
AND TA.C = 3
AND TA.D = 4
AND TA.E = '5'
AND TA.F = 6
AND TA.G = '7')
----------------------------------

修正後
----------------------------------
USING (SELECT
'1' AS A,
'2' AS B,
3 AS C,
4 AS D,
'5' AS E,
6 AS F,
'7' AS G
FROM DUAL TB
ON (TA.A = TB.A
AND TA.B = TB.B
AND TA.C = TB.C
AND TA.D = TB.D
AND TA.E = TB.E
AND TA.F = TB.F
AND TA.G = TB.G)
----------------------------------
OTGの過去ログ(キャッシュ)
http://72.14.235.104/search?q=cache:Xw6XDD_FZ2sJ:otn.oracle.co.jp/cgi-bin/non/msgview_r.cgi%3Fcommunityid%3Dotn-901234%26bbsid%3D1%26no%3D19833%26view%3D8+MERGE%E3%80%80ORACLE%E3%80%80%E4%B8%8D%E5%85%B7%E5%90%88&hl=ja&gl=jp&ct=clnk&cd=3
Oracleに問い合わせするということでCloseになってて結果不明。
9iのMERGEは使わないほうがいいかもです。
海鶏
会議室デビュー日: 2007/02/01
投稿数: 3
投稿日時: 2007-02-01 16:48
9iではUSINGにDUAL表の使用はうまくいかなかった記憶があります。
前の人のようにSELECTの結果にすれば問題なかった思います。

※MERGEでUPDATEしかしないときと間違えたので修正

[ メッセージ編集済み 編集者: 海鶏 編集日時 2007-02-01 17:33 ]
海鶏
会議室デビュー日: 2007/02/01
投稿数: 3
投稿日時: 2007-02-01 18:08
こういう場合えてして
コード:
   A = '1' 
AND B = '2' 
AND C = 3 
AND D = 4 
AND E = '5' 
AND F = 6 
AND G = '7'


な行が存在する別のテーブルTBL2があったりしませんか?
もしあればそのテーブルを利用して
コード:
USING (
SELECT A, B, C, D, E, F, G 
  FROM TBL2 TB 
 WHERE TA.A = '1' 
   AND TA.B = '2' 
   AND TA.C = 3 
   AND TA.D = 4 
   AND TA.E = '5' 
   AND TA.F = 6 
   AND TA.G = '7')
ON (TA.A = TB.A 
AND TA.B = TB.B 
AND TA.C = TB.C 
AND TA.D = TB.D 
AND TA.E = TB.E 
AND TA.F = TB.F 
AND TA.G = TB.G) 


な感じに書くのがいいのではないかと思います。
ひろ@ya
大ベテラン
会議室デビュー日: 2006/02/23
投稿数: 168
投稿日時: 2007-02-01 19:02
MERGEは9iの新機能ですので、正直言って初期のバージョンではバグが枯れきっていません。
可能であればサポートからパッチを入手して下さい。
jai
会議室デビュー日: 2007/01/24
投稿数: 16
投稿日時: 2007-02-05 11:54
遅レスで申し訳ございません。

オラクルのバージョンは9.2.0.1.0 でした。
バグって事にして、バージョンアップしてみます。

ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)