前提・実現したいこと
spring boot内で、SimpleJdbcCallを介して、postgresql(version12)のstored procedureを呼びたいのですが、エラーが出てしまいます。
作業環境は以下の通りです。
windows 10
spring boot 2.5.0
postgresql 12
jdbc
発生している問題・エラーメッセージ
Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback; bad SQL grammar [{call demo()}]; nested exception is org.postgresql.util.PSQLException: ERROR: demo() is a procedure
ヒント: To call a procedure, use CALL.
位置: 15
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:101)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1541)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1206)
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1245)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:412)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:372)
at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:198)
該当のソースコード
spring boot内でprocedureを呼んでいる部分は以下の通りです。
以下のexecuteを実行する際に上記エラーが出ます。
java
1SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate.getDataSource()) 2 .withProcedureName("demo") 3MapSqlParameterSource in = new MapSqlParameterSource() 4Map<String, Object> out = call.execute(in);//ここでエラー。
postgresqlのstored procedureは以下の通りです。テスト用のため中身は空にしています。
sql
1CREATE OR REPLACE PROCEDURE public.demo() 2 LANGUAGE plpgsql 3AS $procedure$ 4begin 5end 6$procedure$
試したこと
slf4jを用いてspring bootから発行されたsql文を確認すると以下のように表示されます。
INFO 10908 --- [ main] jdbc.sqlonly : {call demo()}
ERROR 10908 --- [ main] jdbc.sqlonly : 1. CallableStatement.execute() {call demo()}
これを見る限りではcallを使用してprcedureを呼んでいるようですが、上記エラーメッセージではprocedureを呼ぶためにはcallを使用するように指摘されています。
なお、SimpleJdbcCallに替えて、直接sql文を書くように変更した場合、エラーなくprocedureを呼べます(以下)。
java
1int price = jdbcTemplate.queryForObject("call get_price(?)", Integer.class,1000);
不足している情報があればご指摘下さい。補足させていただきます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。