executeUpdate() returns 始终为 1 与 MERGE 语句

executeUpdate() returns always 1 with MERGE statement

ExecuteUpdate() 总是 returning 1。请提出建议并感谢任何输入。

程序:

PROCEDURE INSERT_USER_PREFERENCES(owner_id_var varchar2, stripeid_var varchar2, type_var varchar2, metadata_var CLOB) AS
BEGIN
    MERGE INTO CXO_USER_PREFERENCES d
    USING(SELECT stripeid_var id FROM dual) s
    ON (d.stripe_id = s.id)
    WHEN NOT MATCHED THEN
        INSERT (OWNER_ID, STRIPE_ID, PREF_TYPE, METADATA, CREATED_DATE )
        VALUES(owner_id_var, stripeid_var, type_var, metadata_var, CURRENT_TIMESTAMP);

    COMMIT;
END  INSERT_USER_PREFERENCES;

Java代码:

try (CallableStatement stmt = connection.prepareCall(CREATE_USER_PREF_SQL)) {
        SQLParameterMapper sqlParamMapper = new SQLParameterMapper(CREATE_USER_PREF_SQL);
        sqlParamMapper.setString(stmt, ":ownerId", userName);
        sqlParamMapper.setCharacterStream(stmt, ":metadata", reader, metadata.length());
        sqlParamMapper.setString(stmt, ":stripeId", stripeId);
        sqlParamMapper.setString(stmt, ":type", userPreference.getType());

        // invoke the database
        int value = stmt.executeUpdate();
        return value;
    } catch (SQLException e) {
        throw e;
    }

stmt.executeUpdate() - 总是 returns 1,即使插入只发生一次。感谢对此的任何投入。理想情况下,如果没有插入或错误,它应该 return 0 或任何异常跟踪。请建议。**

我们可以将列设为主键。现在当多个 VM 尝试执行时,另一个将抛出一个 Unique Integrity 异常,在 catch 块中,我们可以读取 SQLException。读取SQLException后,我们也可以读取sqlstate,我们可以根据sqlstate执行需要的操作。

下面的示例代码

     if (e instanceof SQLException) {
            String sqlState = ((SQLException) e).getSQLState();
            if (sqlState.equalsIgnoreCase("08000") || sqlState.equalsIgnoreCase("08006")) {
                logger.error("POD DB is down with the sql state:" + sqlState);
                return true;
            }
        }