为什么我在批处理从Java上执行PostgreSQL上的存储过程时收到错误通知"结果不被预期"?

Ren*_*ani 8 java postgresql stored-procedures plpgsql

我在数据库中有这个过程:

CREATE OR REPLACE FUNCTION replacePageRelevance(id INT, value REAL) RETURNS VOID AS $$
BEGIN
INSERT INTO pageRelevance VALUES (id,value);
EXCEPTION WHEN unique_violation THEN
    UPDATE pageRelevance SET relevance = value WHERE pageId = id;       
END
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

这段代码调用了这个函数:

private final String PAGE_RELEVANCE_SQL = "SELECT replacePageRelevance(?,?::REAL)";
try (CallableStatement cstm = conn.prepareCall(PAGE_RELEVANCE_SQL)) {
        for (Map.Entry<Integer, Double> entry : weightMap.entrySet()) {
            cstm.setInt(1, entry.getKey());
            cstm.setDouble(2, entry.getValue());
            cstm.addBatch();
        }
        cstm.executeBatch();
    } catch (SQLException e) {
        LOGGER.error("Error discovering pages relevance: " + e.getNextException());
    }
}
Run Code Online (Sandbox Code Playgroud)

当我执行批处理时,会在表中插入或替换值,但在此之后,我收到一个异常通知 A result was returned when none was expected.

如果我称之为程序或程序本身,我不知道出了什么问题.可能是什么问题以及如何解决?

SELECT正确/唯一的方式调用程序?

Pau*_*ora 6

从我可以告诉你使用的SELECT时候call应该使用.

JDBC接口上PostgreSQL文档的一个示例:

// Turn transactions off.
con.setAutoCommit(false);
// Procedure call.
CallableStatement upperProc = con.prepareCall("{ ? = call upper( ? ) }");
upperProc.registerOutParameter(1, Types.VARCHAR);
upperProc.setString(2, "lowercase to uppercase");
upperProc.execute();
String upperCased = upperProc.getString(1);
upperProc.close();
Run Code Online (Sandbox Code Playgroud)

请注意,? = call在您的情况下,结果的语法是不必要的 - 您将只想使用call replacePageRelevance(?,?::REAL)

这种语法与实际的PostgreSQL不同的原因是因为这是JDBC规范的一部分.

  • 感谢您的帮助,与{call}合作.我只想强调`call`必须是小写的. (3认同)