1

次のステートメントを実行しようとすると、次のようになります。

INSERT INTO myTable (id, some_data, more_data)             
SELECT ?, ?, ? FROM dual 
WHERE NOT EXISTS (
    SELECT 1 FROM myTable WHERE id = ?)

ORA-01461を取得します。LONG列に挿入する場合にのみLONG値をバインドできます。

ただし、クエリを次のように変更すると、次のようになります。

INSERT INTO myTable (id, some_data, more_data)             
VALUE (?, ?, ?)

同じ値を使用して、ステートメントは成功します。

私のテーブルにはVARCHAR2とBLOBが含まれていることに注意してください。ただし、両方のステートメントの値は同じです。

オリジナルが失敗した理由は何ですか?

編集1:コメンター(Romain)と同僚が、INSERT ... SELECT ... WHERE NOTEXISTSの代わりにMERGEINTOを使用することを提案しました...いい点ですが、同じ問題が発生します(ORA-01461 ... LONG ... LONG)。

Edit2:BLOB列のto_lob(?)も機能せず、「ORA-00932:一貫性のないデータ型:期待されるLONGBINARYがBINARYを取得しました」と表示されます。

4

1 に答える 1

0

値の例を教えてください。単純な値で動作します:

CREATE TABLE feed (Id NUMBER,   DATA VARCHAR2(30)  , data1 BLOB);
INSERT INTO feed VALUES (1, '1', '1');
INSERT INTO feed (id, DATA, data1)           
  SELECT 1, '1', '1' FROM dual  WHERE NOT EXISTS ( SELECT 1 FROM feed WHERE id = 1) ;
INSERT INTO feed 
   (SELECT 2, '1', '1' FROM dual  
     WHERE NOT EXISTS (     SELECT 1 FROM feed WHERE id = 3) );
Result:
SELECT * FROM feed
1   1   1   <BLOB>
2   1   1   <BLOB>
于 2012-05-09T07:05:35.550 に答える