2012-05-28 6 views
0

아래 쿼리를 사용하여 Oracle Database에 업데이트하고 삽입하려고합니다. 나는이 아래 쿼리를 사용하여 오라클 데이터베이스에 삽입하려고 할 때, 나는 항상UPSERT 쿼리에 ORA 누락 된 식 예외가 발생합니다.

java.sql.SQLException: ORA-00936: missing expression 

이 UPSERT 질의 - 아래의 쿼리 아래이 문제 있나요되어 시스 - 예외를 얻을?

// Update and Insert both 
    public static final String UPSERT_SQL = "MERGE INTO " +DATABASE_TABLE+ " USING ( SELECT ? AS ID, " + // We will maybe add this record 
    "    ? AS CGUID, " + 
    "    ? AS PGUID, " + 
    "    ? AS SGUID, "+ 
    "    ? AS USERID, "+ 
    "    ? AS ULOC, "+ 
    "    ? AS SLOC, "+ 
    "    ? AS PLOC, "+ 
    "    ? AS ALOC, "+ 
    "    ? AS SITEID, "+ 
    "    FROM dual) maybe "+ 
    // Checking whether ID got matched, if matched then we will update the database table (ULOC, SLOC, PLOC, ALOC) 
    " ON (maybe.ID = "+DATABASE_TABLE+".ID) "+ 
    "   WHEN MATCHED THEN "+ 
      // We only need update the fields that might have changed 
    "  UPDATE SET " +DATABASE_TABLE+ ".ULOC = maybe.ULOC, " +DATABASE_TABLE+ ".SLOC = maybe.SLOC, " +DATABASE_TABLE+ ".PLOC = maybe.PLOC, " +DATABASE_TABLE+ ".ALOC = maybe.ALOC "+ 
    // If not matched then we will Insert new records in the database. 
    "   WHEN NOT MATCHED THEN "+ 
     // Insert new record 
    " INSERT VALUES (maybe.ID, maybe.CGUID, maybe.PGUID, maybe.SGUID, maybe.USERID, maybe.ULOC, maybe.SLOC, maybe.PLOC, maybe.ALOC, maybe.SITEID)"; 

그리고 this-

LnPDataConstants.PSTMT = LnPDataConstants.DB_CONNECTION.prepareStatement(LnPDataConstants.UPSERT_SQL); 
LnPDataConstants.PSTMT.setInt(1, (int) ind); 
LnPDataConstants.PSTMT.setString(2, LnPDataConstants.CGUID_VALUE); 
LnPDataConstants.PSTMT.setString(3, LnPDataConstants.PGUID_VALUE); 
LnPDataConstants.PSTMT.setString(4, LnPDataConstants.SGUID_VALUE); 
LnPDataConstants.PSTMT.setString(5, LnPDataConstants.UID_VALUE); 
LnPDataConstants.PSTMT.setString(6, LnPDataConstants.ULOC_VALUE); 
LnPDataConstants.PSTMT.setString(7, LnPDataConstants.SLOC_VALUE); 
LnPDataConstants.PSTMT.setString(8, LnPDataConstants.PLOC_VALUE); 
LnPDataConstants.PSTMT.setString(9, LnPDataConstants.ALOC_VALUE); 
LnPDataConstants.PSTMT.setString(10, LnPDataConstants.SITEID_VALUE); 
LnPDataConstants.PSTMT.executeUpdate(); 

처럼 삽입하려고 그리고 있어요 나는 내가는 console

MERGE INTO LNPDATA USING ( SELECT ? AS ID,     ? AS CGUID,     ? AS PGUID,     ? AS SGUID,     ? AS USERID,     ? AS ULOC,     ? AS SLOC,     ? AS PLOC,     ? AS ALOC,     ? AS SITEID,     FROM dual) maybe ON (maybe.ID = LNPDATA.ID)   WHEN MATCHED THEN  UPDATE SET LNPDATA.ULOC = maybe.ULOC, LNPDATA.SLOC = maybe.SLOC, LNPDATA.PLOC = maybe.PLOC, LNPDATA.ALOC = maybe.ALOC   WHEN NOT MATCHED THEN INSERT VALUES (maybe.ID, maybe.CGUID, maybe.PGUID, maybe.SGUID, maybe.USERID, maybe.ULOC, maybe.SLOC, maybe.PLOC, maybe.ALOC, maybe.SITEID) 

답변

2
"    ? AS SITEID, "+ 
"    FROM dual) maybe "+ 

에 같이있어 질의 - 인쇄하려고 할 때 쉼표를 제거하십시오.

-1

당신은 여전히 ​​당신의 insert 문의 열을 나열 할 필요가

WHEN NOT MATCHED THEN 
INSERT (col1, col2 ...) 
VALUES (val1, val2 ...) 
관련 문제