2012-05-09 177 views
1

下面我正在創建表。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查詢時,我試圖更新我的數據庫表我總是getting- 值java.sql.SQLException:ORA-00936:缺少表達 。我檢查了我的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

FROM DUAL之前的逗號被SQL解析器忽略了嗎? – Luciano

+0

Yup發現了問題。謝謝您的幫助。 – AKIWEB

+0

正如Luciano所說,最可能的原因是「?as attributevalue」之後的逗號,因爲解析器會在逗號後期待另一個表達式。 – ChadNC

回答

7

是的,有一個與SQL有些不對勁,這是你以前寫過一個逗號FROM雙。這會導致Oracle的SQL解析器投訴。