在IF-THEN-ELSE上获取未知命令错误

时间:2017-03-29 07:22:55

标签: oracle oracle11g

我在Oracle 11g中使用了以下查询

IF EXISTS (SELECT * FROM EMPLOYEE_MASTER WHERE EMPID='ABCD32643') 
THEN 
update EMPLOYEE_MASTER set EMPID='A62352',EMPNAME='JOHN DOE',EMPTYPE='1' where EMPID='ABCD32643' ;
ELSE 
insert into EMPLOYEE_MASTER(EMPID,EMPNAME,EMPTYPE) values('A62352','JOHN DOE','1') ;
END IF;

在运行语句时,我得到以下输出:

Error starting at line : 4 in command -
ELSE 
Error report -
Unknown Command


1 row inserted.

Error starting at line : 6 in command -
END IF
Error report -
Unknown Command

直接运行时,插入的值会出错。但是当我尝试通过我的应用程序执行此查询时,由于生成错误,我得到了一个oracle异常:

ORA-00900: invalid SQL statement

因此未插入值。

我对Oracle比较陌生。请告知上述查询有什么问题,以便我可以无错运行此查询。

2 个答案:

答案 0 :(得分:1)

如果MERGE不适合您,请尝试以下操作:

begin
  update EMPLOYEE_MASTER set EMPID='A62352',EMPNAME='JOHN DOE',EMPTYPE='1' 
    where EMPID='ABCD32643' ;
  if SQL%ROWCOUNT=0 then
    insert into EMPLOYEE_MASTER(EMPID,EMPNAME,EMPTYPE)
      values('A62352','JOHN DOE','1') ;
  end if;
end;

在这里,您是update规范,然后检查您是否找到了匹配的行,insert以防万一。

答案 1 :(得分:0)

  

“上述查询有什么问题”

查询的错误在于它不是查询(SQL)。它应该是一个程序片段(PL / SQL),但它不是作为PL / SQL块编写的,由BEGINEND;关键字构成。

但将其转换为匿名的PL / SQL块无济于事。 Oracle PL / SQL不支持IF EXISTS (select ...语法。

幸运的是,Oracle SQL支持MERGE语句,它与您的代码完全相同,输入更少。

merge into EMPLOYEE_MASTER em
using ( select 'A62352' as empid,
               'JOHN DOE' as empname,
               '1' as emptype
         from dual ) q
on (q.empid = em.empid)
when not matched then
    insert (EMPID,EMPNAME,EMPTYPE) 
           values (q.empid, q.empname, q.emptype)
when matched then
    update 
    set em.empname = q.empname, em.emptype = q.emptype
/

除了您尝试更新empid之外。 MERGE不支持这一点。你为什么要更改主键?

  

“此查询是否需要我向表中的所有列添加值?”

INSERT可以包含表格中的所有列。 UPDATE无法更改ON子句中使用的列(通常是主键),因为这是MERGE工作方式的限制。我认为这与我们在更新视图时看到的密钥保存机制相同。 Find out more