4

我一直在尝试在 Oracle 的 SQL Developer 中编写一个 SQL 查询,如果它存在则更新一行,如果不存在则插入一个。除了主键 (UNITOFMEASURE_USERID),还有三列:UNITOFMEASUREID、USERID 和 ACTIVE。UNITOFMEASUREID 和 USERID 的组合有一个独特的约束,因此对于每个值组合都有一行或 0。我一直在尝试两种不同的 SQL 安排,它们都返回一个类似的编译错误,抱怨缺少右括号. 这是我尝试过的: 第一种安排:

UPDATE NORSEMEN.UNITOFMEASURE_USER SET (ACTIVE=1) WHERE UNITOFMEASUREID=:unitOfMeasureId AND USERID=:userId
IF @@ROWCOUNT=0
    INSERT INTO NORSEMEN.UNITOFMEASURE_USER (UNITOFMEASUREID, USERID) VALUES (:unitOfMeasureId, :userId)

第一次安排的 SQL Developer 错误响应:

Error at Command Line:1 Column:46
Error report:
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:

第二种安排:

IF EXISTS (SELECT * FROM NORSEMEN.UNITOFMEASURE_USER WHERE UNITOFMEASUREID=:unitOfMeasureId AND USERID=:userId)
    UPDATE NORSEMEN.UNITOFMEASURE_USER SET (ACTIVE = 1) UNITOFMEASUREID=:unitOfMeasureId AND USERID=:userId
ELSE
    INSERT INTO NORSEMEN.UNITOFMEASURE_USER (UNITOFMEASUREID, USERID) VALUES (:unitOfMeasureId, :userId)

第二种安排的 SQL Developer 错误响应:

Error at Command Line:2 Column:47
Error report:
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:

我无法弄清楚为什么 SQL Developer 认为缺少括号。任何人都可以帮忙吗?

4

2 回答 2

6

在您的情况下,如果记录匹配条件为真,则需要使用任何程序处理来更新active表的列,或者如果不是,则插入新记录。您可以使用merge在单个语句中执行此操作。

merge 
 into unitofmeasure_user
using dual
  on (
      unitofmeasureid = :unitOfMeasureId AND 
      userid = :userId
     )
when matched 
then update 
        set active = 1
when not matched
then insert (unitofmeasureid, userid) 
       values (:unitOfMeasureId, :userId);
于 2012-10-05T22:27:03.260 回答
2

你有一个语法错误,会给你确切的错误信息;

UPDATE NORSEMEN.UNITOFMEASURE_USER SET (ACTIVE=1) WHERE ...

应该

UPDATE NORSEMEN.UNITOFMEASURE_USER SET ACTIVE=1 WHERE ...

在第二种安排中,您还缺少一个WHERE.

于 2012-10-05T22:07:24.363 回答