我在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比较陌生。请告知上述查询有什么问题,以便我可以无错运行此查询。
答案 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块编写的,由BEGIN
和END;
关键字构成。
但将其转换为匿名的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。