2012-05-09 2 views
1

아래 테이블을 생성 중입니다. ORA-00936를 : 표현 누락 내가 항상 은 java.sql.SQLException을 getting-하고 내 데이터베이스 테이블을 업데이트하려고 할 때java.sql.SQLException : ORA-00936 : 누락 된 표현

public static final String CREATE_SQL = "CREATE TABLE " +DATABASE_TABLE + 
     "(ID number(10,0), " + 
     " CGUID VARCHAR(255), " + 
     " PGUID VARCHAR(255), " + 
     " SGUID VARCHAR(255), " + 
     " USERID VARCHAR(255), " + 
     " ULOC VARCHAR(255), " + 
     " SLOC VARCHAR(255), " + 
     " PLOC VARCHAR(255), " + 
     " ALOC VARCHAR(255), " + 
     " SITEID VARCHAR(255), " + 
     " ATTRIBUTEID VARCHAR(255), " + 
     " ATTRIBUTEVALUE VARCHAR(255), " + 
     " PRIMARY KEY (ID))"; 

이 UPSERT_SQL 쿼리 아래입니다. 내 SQL을 검사했는데 표현이 누락 된 부분을 찾을 수 없다. 아래의 SQL에 문제가 있습니까?

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, "+ 
    "    ? AS ATTRIBUTEID, "+ 
    "    ? AS ATTRIBUTEVALUE, "+ 
    "    FROM dual) maybe "+ 
    " 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 "+ 
    "   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, maybe.ATTRIBUTEID, maybe.ATTRIBUTEVALUE)"; 

아래에서 나는 해당 UPSERT_SQL 문을 실행하고 있습니다.

LnPDataConstants.PSTMT = LnPDataConstants.DB_CONNECTION.prepareStatement(LnPDataConstants.UPSERT_SQL); // create a statement 
         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.setString(11, "10200"); 
         LnPDataConstants.PSTMT.setString(12, attrValue1.toString().split("=")[1]); 
         LnPDataConstants.PSTMT.executeUpdate(); 
+2

SQL 파서에서 FROM DUAL을 (를) 쉼표로 무시합니까? – Luciano

+0

Yup가 문제를 발견했습니다. 도와 주셔서 감사합니다. – AKIWEB

+0

Luciano가 말했듯이 파서가 쉼표 뒤에 다른 표현식을 기대하기 때문에 "? attributevalue"다음에 쉼표가 가장 많이 사용됩니다. – ChadNC

답변