Oracle 获取IF-THEN-ELSE上的未知命令错误
我在Oracle 11g中使用以下查询Oracle 获取IF-THEN-ELSE上的未知命令错误,oracle,oracle11g,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) v
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
因此不会插入值
我对甲骨文比较陌生。请告诉我上面的查询有什么问题,这样我就可以无错误地运行这个查询了
“上面的查询有什么问题?”
查询的错误在于它不是一个查询(SQL)。它应该是一个程序片段(PL/SQL),但它不是以PL/SQL块的形式编写的,由BEGIN
和END构成框架代码>关键字
但将其转换为匿名PL/SQL块并没有帮助。如果存在,Oracle PL/SQL不支持(选择…
语法)
幸运的是,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
子句中使用的列(通常是主键)因为这是合并工作方式的一个限制。我认为这与我们在更新视图时看到的密钥保存机制相同。如果合并
对您不起作用,请尝试以下操作:
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;
在这里,您可以按规格更新数据,然后检查是否找到匹配的行,如果没有,请插入数据。此查询是否需要我向表中的所有列添加值?表中还有一些列,但这些列是可以为空的。我尝试运行了您提出的查询,但出现了以下错误:呃命令行中的ror:1列:12错误报告-SQL错误:ORA-00947:值不足,您需要更改INSERT语句以指定正在使用的列。我已更正代码以适合您在POST中的列。我使用了INSERT语句中的所有列,但仍然会得到相同的错误,如果您注意到错误点s到查询的第一行,这意味着合并可能还需要列出所有列(完全是胡乱猜测)我的解决方案应用您在问题中使用的列。如果您想使用更多的列,您需要通过在USING子句中向子查询添加列来修改该解决方案。这不是向查询传递参数的唯一方法,它只是一个独立的示例。您真的想更改EMPID
?是EMPID
th吗e主键?非常好用!!谢谢。