2013-05-07 136 views
0

我在Oracle Equivalent to MySQL INSERT IGNORE? 上發現了一個非常類似的話題但是,我無法使任何建議的解決方案成功。我的情況有點特別,因爲我的表只包含1個字段,這是主鍵。我們在下面調用字段「id」和表「myTable」。Oracle相當於INSERT IGNORE

使用合併

merge into myTable t1 from (
    select 42 as the_pk_value, 'TEST' as some_column from dual 
) t2 on (t1.id = t2.the_pk_value) 
when not matched then 
    insert (id) values (t2.the_pk_value); 

這第一次嘗試給出一個SQL Error: ORA-02012: missing USING keyword錯誤消息。我不得不承認,我不明白提出的語法,所以也許我在適應我的pk-only表時弄糟了一些東西。但由於示例沒有使用任何USING關鍵字,我不明白我的錯誤可能在哪裏。

使用提示

insert /*+ ignore_row_on_dupkey_index(SPSECU, PK_SPSECU) */ into myTable (id) values ('TEST'); 

這並通過SQL開發工作,但是它並沒有從Java工作(我懷疑OJDBC驅動程序刪除這些註釋,以減少傳輸大小。BTW我無法弄清楚哪些我使用......春節工具的源束似乎沒有任何進一步的配置Oracle數據庫連接JDBC驅動程序。我看到僅安裝了DERBY默認的驅動程序。

使用NOT EXISTS

我無法使此語法工作。下面是我寫的:

insert into myTable (id) values ('TEST') where not exists (select id from myTable where id='TEST'); 

我得到一個錯誤SQL Error: ORA-00933: SQL command not properly ended此版本。

使用INSERT選擇

我不明白的knagaev提出的解決方案的任何東西......試圖使其適應我的表給了我這個:

insert into myTable t1 select id from myTable t2 where not exists (select 1 from t1 where t1.id = 'TEST'); 

有人能幫助我嗎?我習慣了MySQL INSERT IGNORE簡單的語法,並且在Oracle上很新(使用11g版本)。

回答

1

合併使用using而不是from

merge into myTable t1 USING (
    select 42 as the_pk_value, 'TEST' as some_column from dual 
) t2 on (t1.id = t2.the_pk_value) 
+0

你的語法使用SQL開發人員確實工作。但是...由於某種原因,從Java調用'ORA-00001:唯一約束(PK_MYTABLE)違反'會出現。該錯誤消息確實打印了確切的SQL查詢,當我在SQL Developer中複製粘貼它時,它完美地工作(第一條消息:1行合併。後面的消息:0行合併)。任何想法 ? – Wis 2013-05-07 10:16:40

+0

不確定,我不是Java專家。也許用代碼片段發佈一個新的Java問題? – Andomar 2013-05-07 10:40:36

+0

我懷疑Oracle驅動程序有什麼......現在我接受你的解決方案,你給了我一個有效的Oracle答案(即使它通過Java調用失敗了)。 – Wis 2013-05-07 11:51:53