Почему я получаю сообщение об ошибке, сообщающее, что «результат не ожидался» при выполнении хранимых процедур на PostgreSQL из Java в пакете? - PullRequest
8 голосов
/ 02 сентября 2011

У меня есть эта процедура в базе данных:

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;

И этот код, который вызывает эту функцию:

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());
    }
}

Когда я выполняю пакет, значения вставляются или заменяются в таблице, но после этого я получаю исключение, сообщающее, что A result was returned when none was expected.

Я не знаю, что не так, если я так называю процедуру или саму процедуру. В чем может быть проблема и как ее решить?

Вызов процедуры с SELECT является правильным / единственным способом?

1 Ответ

6 голосов
/ 02 сентября 2011

Из того, что я могу сказать, вы используете SELECT, когда следует использовать call.

Пример из документации PostgreSQL по интерфейсу JDBC :

// 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();

Обратите внимание, что синтаксис ? = call для результата не нужен в вашем случае - вы захотите использовать просто call replacePageRelevance(?,?::REAL)

Причина, по которой этот синтаксис отличается от реального PostgreSQL, заключается в том, что он является частью спецификации JDBC .

...