2016-12-14 10 views
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クライアントから関数を呼び出すと、すべて正常に動作します。

+1

データベースの多くの作品の後も私に例外

jdbcTemplate.queryForObject("values vlib.ST_CLIENT_SEGMENT(?)", new Object[] {oib}, String.class); //Caused by: java.sql.SQLException: [SQL0418] Use of parameter marker not valid. 

を与えた別のSQLは、(機能が孤立して呼ばれることを許可していないしてみてくださいストアドプロシージャ)では、selectクエリなどで関数を使用しようとする可能性があります。 –

+0

@MarkRotteveel私が言ったように、それは私のSQLクライアント(同じユーザー)から動作します。 "値vlib.st_client_segment( '123');"または「SYSIBM.SYSDUMMY1からVLIB.ST_CLIENT_SEGMENT( '123')を選択してください。 – Ivan

+0

これは、SimpleJdbcCallによって構築されたものと同等であると想定しています。コードを見ると、実際にはJDBCエスケープが構築されています: '{?= vlib.st_client_segment(?)}'を呼び出すと、JDBCドライバによって変換される必要があります。 DB2 JDBCドライバーは、JDBC呼び出しエスケープでストアード・プロシージャーの実行のみをサポートしているため、関数呼び出しのために無効なSQLを生成する可能性があります。 –

答えて

2

私の同僚が解決策を見つけました。これはDB2の問題http://www.itjungle.com/fhg/fhg102506-story01.htmlのようです。 私は、彼らがただになるので、この変更のすべてがうまく

jdbcTemplate.queryForObject("values vlib.ST_CLIENT_SEGMENT(CAST(? as CHAR))", new Object[] {oib}, String.class); 
関連する問題