java.sql.SQLException:ORA-00936:缺少表达式

时间:2012-05-09 17:12:21

标签: java oracle 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查询我总是得到 - 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();

1 个答案:

答案 0 :(得分:9)

是的,SQL有问题,而且你在 FROM dual 之前写了一个逗号。这导致Oracle的SQL解析器抱怨。