下面我正在创建表。
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();
是的,SQL有点问题,这是您在 FROM dual 之前写了一个逗号。这导致Oracle的SQL分析器抱怨。