1

Spring JDBC を使用して SQL 関数を実行しようとしています。

私のコードは

SimpleJdbcCall caller = new SimpleJdbcCall(this.jdbcTemplateRandOnline).withCatalogName("RATELIMIT_OWN").withFunctionName("Get_Logs");
RateLimitLogBean resultBean = null;
SqlParameterSource paramMap = new MapSqlParameterSource().addValue(P_YYYYMM, inputBean.getMonth(), Types.VARCHAR).addValue(P_NUMEC, inputBean.getNumec(), Types.INTEGER);
resultBean = caller.executeFunction(RateLimitLogBean.class, paramMap);

しかし、このコードを実行すると、以下のエラーが発生します

org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; SQL の uncategorized SQLException [{? = RATELIMIT_OWN.GET_LOGS()} を呼び出す]; SQL 状態 [99999]; エラーコード [17041]; インデックスに IN または OUT パラメータがありません:: 1; ネストされた例外は java.sql.SQLException: Missing IN or OUT parameter at index:: 1 at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate です。 (AbstractFallbackSQLExceptionTranslator.java:80) org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1030) で org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1064) で org.springframework. jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:

なぜこのエラーがスローされるのか理解できませんでした。準備済みステートメントの場合、入力および出力パラメーターを宣言してコンパイルします。しかし、関数の場合、SqlParamSource として渡すときにどのようにコンパイルできますか

Sql関数

FUNCTION RATELIMIT_OWN.Get_Logs ( p_yyyymm VARCHAR2, p_numec NUMBER )

この関数は、タイプのレコードを返します

TYPE RATELIMIT_OWN.LOG_RECORD AS OBJECT
   (EVENTID              VARCHAR2(15),
    MSG                    VARCHAR2(2000),
    CREATE_DATE      DATE);

Spring フレームワークにデバッグしました。私が見つけたのは、

org.springframework.jdbc.core.metadata.CallMetaDataContext.reconcileParameters メソッド、私は this.metaDataProvider.getCallParameterMetaData() この arraylist を取得しています。すべての値は null です。

何らかの理由?

4

2 に答える 2

1

関数のパラメーターを次のように宣言する必要があります。

SimpleJdbcCall caller = new SimpleJdbcCall(this.jdbcTemplateRandOnline)
                                           .withCatalogName("RATELIMIT_OWN")
                                           .withFunctionName("Get_Logs")
                                           .withReturnValue()
                                           .declareParameters(
                                              new SqlParameter("p_yyyymm",java.sql.Types.VARCHAR))
                                           .declareParameters(
                                              new SqlParameter("p_numec",java.sql.Types.INTEGER));
于 2012-09-06T16:25:48.670 に答える