2015-12-21 93 views
-1

我有條件INSERT INTO使用SELECT'WHERE NOT'失敗。通過試圖追蹤我在Google上找到的聲稱他們工作的示例,我得到了這種語法。我無法弄清楚語法錯在哪裏,除非我所做的不被支持?條件INSERT INTO使用SELECT'WHERE NOT'失敗

INSERT INTO ENV (ENV_ID, ENV_NAME, SSO_URL, ENV_NAME_LOWER) 
SELECT '99', 'Blah', 'https://blah.com:443', 'production' 
WHERE NOT EXISTS (SELECT 1 FROM ENV WHERE ENV_ID = '99'); 

這裏是我在甲骨文得到的錯誤:

Error at Command Line : 3 Column : 1 
Error report - 
SQL Error: ORA-00923: FROM keyword not found where expected 
00923. 00000 - "FROM keyword not found where expected" 

UPDATE: 得到了滿意的答案,但不能完全得到它應有的工作,以另一個錯誤:​​

+0

sql中的語法是'INSERT INTO'和VALUES' –

+0

好的,所以你暗示唯一的方法就是使用MERGE語句? – djangofan

+0

@RichardHamilton在這方面,OP的語法是正確的,你可以在SQL中提供一個帶有查詢結果的插入語句。 – collapsar

回答

4

的由於缺少from子句,外部查詢的語法不正確。儘管您僅使用文字值,仍需要指定它。 Oracle爲此提供'雙'表:

INSERT INTO ENV (ENV_ID, ENV_NAME, SSO_URL, ENV_NAME_LOWER) 
    SELECT '99', 'Blah', 'https://blah.com:443', 'production' 
     FROM DUAL 
     WHERE NOT EXISTS (SELECT 1 FROM ENV WHERE ENV_ID = '99') 
      ; 

如果測試的env記錄存在,語句將失敗。

+0

謝謝,看起來像語法是正確的。我想我受限於我的數據庫權限,因爲我得到這個錯誤:ORA-54013:插入操作不允許在虛擬列 – djangofan

+0

恩,也許,你引用的一些列,你知道,[虛擬](https:// oracle -base.com/articles/11g/virtual-columns-11gr1)?使用這個查詢:'select_list_name ='ENV'',從user_tab_cols中選擇column_name,virtual_column。虛擬列將具有「是」。 –