4

Oracle の SQL Developer で、行が存在する場合は行を更新し、存在しない場合は行を挿入する SQL クエリを作成しようとしています。主キー (UNITOFMEASURE_USERID) の他に、UNITOFMEASUREID、USERID、および ACTIVE の 3 つの列があります。UNITOFMEASUREID と USERID の組み合わせには一意の制約があるため、値の組み合わせごとに 1 つの行または 0 があります。私は 2 つの異なる 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:

2 番目の配置:

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)

2 番目の配置に対する 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 ...

2番目の配置では、も欠落していWHEREます。

于 2012-10-05T22:07:24.363 に答える