2015-12-21 95 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。虚拟列将具有“是”。 –