2012-10-05 3 views
4

Oracle SQL Developer에 SQL 쿼리를 작성하여 행이 있으면 업데이트하고 그렇지 않은 경우 삽입합니다. 기본 키 (UNITOFMEASURE_USERID) 외에도 UNITOFMEASUREID, USERID 및 ACTIVE의 세 열이 있습니다. UNITOFMEASUREID와 USERID의 조합에 대한 고유 한 제한 사항이 있으므로 값의 각 조합에 대해 하나의 행 또는 0이 있습니다. 두 가지 다른 SQL 배열을 시도하고 있으며 둘 다 누락 된 권리에 대해 불평하는 비슷한 컴파일 오류를 반환합니다 괄호. 이 내가 시도 것입니다 : 먼저 배열 :Oracle SQL Developer : If Exists Update Else 삽입 누락 된 오른쪽 괄호 컴파일러 오류 삽입

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 개발자 오류 응답 먼저 배열에 대한

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 개발자 오류 응답 배열 :

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가 누락 된 괄호가 있다고 생각하는 이유를 알아 내지 못했습니다. 아무도 도와 줄 수 있습니까?

+3

요아킴의 관찰과 마찬가지로, @@ rowcount는 오라클 구문이 아닙니다. 아마도 두 번째 오류가 2 번 라인에 대한 것이기 때문에 PL/SQL 블록에서이 작업을 수행하고있을 것입니다. 어느 쪽이든 [merge] 문을 고려해야합니다 (http://docs.oracle.com/cd/). E11882_01/server.112/e10592/statements_9016.htm) 'upsert'를 수행하십시오. 예를 들어 [this] (http://stackoverflow.com/q/237327/266304)를 참조하십시오. –

+1

모든 절차 코드는 Oracle의 PL/SQL이 아닌 Microsoft SQL Server의 T-SQL과 비슷합니다. 예를 들어, PL/SQL에서'else'가없는'if' 문은'IF 조건입니다 'THEN << 하나 이상의 문 >> END IF; else if'IF 조건 << THEN << 하나 이상의 문 >> ELSE < <하나 이상의 문장 >> END IF;'PL/SQL을 배우기위한 다른 참고 자료, 튜토리얼 및/또는 예제를 찾을 것을 권장합니다. 무료 참조 : http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/toc.htm. 무료 튜토리얼 : http://www.amazon.com/dp/0596514468 –

+1

오라클의 PL/SQL은 if 문을 조건부로 하위 쿼리를 허용하지 않습니다. 그래서 두 번째는'SELECT count (*) INTO : rowCount FROM NORSEMEN.UNITOFMEASURE_USER WHERE UNITOFMEASUREID = : unitOfMeasureId and USERID = : userId and ROWNUM <= 1; IF : rowCount> 0 THEN ... ELSE ... END IF;'단지'merge'를 사용하십시오. –

답변

6

조건에 일치하는 레코드가 true 인 경우 테이블의 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); 
+0

안녕하세요, 감사합니다. 나는 당신의 솔루션을 시도해 왔으며, 내가하고 싶었던 것을 정확하게 수행합니다. 도와 주셔서 감사합니다! –

2

정확한 오류 메시지를 표시하는 구문 오류가 있습니다.

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

두 번째 배열에서

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

해야합니다, 당신은 또한 WHERE을 놓치고있어.

+0

Joachim에게 감사드립니다. 나는 괄호를 사용해서는 안된다는 것을 깨닫지 못했습니다. –