2012-05-09 69 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))"; 

私は、私はいつもjava.sql.SQLExceptionをgetting-ています私のデータベーステーブルを更新しようとしているとき、これはUPSERT_SQLクエリを下回っている: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

SQLパーサーがFROM DUALより前にカンマを無視していますか? – Luciano

+0

Yupさんが問題を発見しました。助けてくれてありがとう。 – AKIWEB

+0

Lucianoが述べたように、パーサーがコンマの後に別の式を期待しているため、 "?as attributevalue"の後ろにコンマがある可能性が最も高いです。 – ChadNC

答えて

7

はい、SQLと間違って何かがある、そしてそれはあなたがデュアル FROM 前にカンマを書いたということです。これにより、OracleのSQLパーサがエラーを発することになります。

関連する問題