1
JavaからDB2上でストアドファンクションを実行しようとしています。それを呼び出す関数とコードは、Springのドキュメントhttps://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc-simple-jdbc-call-3のものと非常によく似ています。ここでは関数宣言があります:SimpleJdbcCallがストアドファンクションで機能しない
CREATE FUNCTION ST_CLIENT_SEGMENT(p_oib VARCHAR(11))
RETURNS VARCHAR(10)
NO EXTERNAL ACTION
ここではコードです:これはなぜ起こるか
//version1
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withSchemaName("VLIB").
.withFunctionName("ST_CLIENT_SEGMENT")
SqlParameterSource in = new MapSqlParameterSource().addValue("p_oib", "123");
return simpleJdbcCall.executeFunction(String.class, in);
//version2
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withSchemaName("VLIB")
.withFunctionName("ST_CLIENT_SEGMENT");
simpleJdbcCall.declareParameters(new SqlParameter("p_oib", Types.VARCHAR));
return simpleJdbcCall.executeFunction(String.class, "123");
//the same exception
//Caused by: java.sql.SQLException: [SQL0440] Routine ST_CLIENT_SEGMENT in VLIB not found with specified parameters.
誰でも知っていますか? SQLクライアントから関数を呼び出すと、すべて正常に動作します。
データベースの多くの作品の後も私に例外
を与えた別のSQLは、(機能が孤立して呼ばれることを許可していないしてみてくださいストアドプロシージャ)では、selectクエリなどで関数を使用しようとする可能性があります。 –
@MarkRotteveel私が言ったように、それは私のSQLクライアント(同じユーザー)から動作します。 "値vlib.st_client_segment( '123');"または「SYSIBM.SYSDUMMY1からVLIB.ST_CLIENT_SEGMENT( '123')を選択してください。 – Ivan
これは、SimpleJdbcCallによって構築されたものと同等であると想定しています。コードを見ると、実際にはJDBCエスケープが構築されています: '{?= vlib.st_client_segment(?)}'を呼び出すと、JDBCドライバによって変換される必要があります。 DB2 JDBCドライバーは、JDBC呼び出しエスケープでストアード・プロシージャーの実行のみをサポートしているため、関数呼び出しのために無効なSQLを生成する可能性があります。 –