簡體   English   中英

使用Spring +沒有為參數指定值來調用Postgres存儲過程

[英]Calling a Postgres stored Procedure using Spring + No value specified for parameter

我在PostgresSql中定義了一個存儲過程,如下所示:

CREATE OR REPLACE FUNCTION update_points(accountId bigint, points numeric(19,5)) RETURNS void AS $$
...
...
$$ LANGUAGE plpgsql;

我調用以下方法來調用該過程:

public void updatePoints(final Account account, final BigDecimal points) {
    SimpleJdbcCall simpleCall = new SimpleJdbcCall(coreJdbcTemplate).withFunctionName("update_points");
    SqlParameterSource inputs = new MapSqlParameterSource()
        .addValue("accountId", account.getId())
        .addValue("points", points);                
    simpleCall.execute(inputs);
}

調用該方法時,出現以下彈簧錯誤:

org.springframework.dao.DataIntegrityViolationException: CallableStatementCallback; SQL [{? = call update_points()}]; No value specified for parameter 1.; nested exception is org.postgresql.util.PSQLException: No value specified for parameter 1.
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:102)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1137)
    at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1173)
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:388)
    at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:348)
    at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:190)
    at net.exchangesolutions.veo.dao.AccountTransactionDaoImpl.updateRewardsConsumedAmount(AccountTransactionDaoImpl.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)

我嘗試了使用CallableStatement調用過程的另一種方法,在這種情況下根本不會調用該函數。 您知道代碼有什么問題嗎,或者您對如何從SpringJPA調用過程有任何建議嗎?

謝謝!

編輯:這就是我用CallableStatement調用的方式:

public void updatePoints(final Account account, final BigDecimal points) {
        Connection connection;
        try {
            connection = coreJdbcTemplate.getDataSource().getConnection();
            CallableStatement callableSt = connection.prepareCall("{call update_points(?, ?)}");
            callableSt.setLong(1, account.getId());
            callableSt.setBigDecimal(2, points);        
            callableSt.executeUpdate();
        } catch (SQLException e) {

        }
    }

我通過使用以下方法解決了這個問題。 我不知道為什么上述兩種方法不起作用。 無論如何,以下解決方案現在正在工作。

public void updatePoints(final Account account,
            final BigDecimal points) {
        coreJdbcTemplate.execute(new CallableStatementCreator() {
            public CallableStatement createCallableStatement(Connection con)
                    throws SQLException {
                CallableStatement cs = con
                        .prepareCall("{call update_points(?, ?)}");
                cs.setLong(1, account.getId());
                cs.setBigDecimal(2, points);
                return cs;
            }
        }, new CallableStatementCallback() {
            public Object doInCallableStatement(CallableStatement cs)
                    throws SQLException {
                cs.execute();

                return null;
            }
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM