Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 获取IF-THEN-ELSE上的未知命令错误_Oracle_Oracle11g - Fatal编程技术网

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

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

我在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
因此不会插入值

我对甲骨文比较陌生。请告诉我上面的查询有什么问题,这样我就可以无错误地运行这个查询了

“上面的查询有什么问题?”

查询的错误在于它不是一个查询(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主键?非常好用!!谢谢。