我在 Sybase 中有一个存储过程,我可以从我最喜欢的 SQL 客户端调用它,如下所示:
exec getFooBar @Foo='FOO', @Bar='BAR'
它返回一个结果表,所以它就像一个查询。它实际上有很多参数,但我只想用 Foo 来调用它,有时指定 Foo 和 Bar 来调用它。
Sybase 是 ASE 15.0,我使用的是 jConnect 6.0.5。
如果我仅指定第一个参数,我可以使用
PreparedCall
调用它:
CallableStatement cs = conn.prepareCall("{call getFooBar(?) }");
cs.setString(1,"FOO");
但是我不能使用
@Foo
符号来传递我的参数:
conn.prepareCall("{call getFooBar @Foo='FOO' }");
conn.prepareCall("call getFooBar @Foo='FOO' ");
conn.prepareCall("{call getFooBar @Foo=? }"); // + setString(1,'FOO')
在所有这些情况下,我从数据库得到异常,告诉我需要 Foo 参数:
com.sybase.jdbc3.jdbc.SybSQLException: Procedure getFooBar expects
parameter @Foo, which was not supplied
理想情况下,我想使用 Spring
JdbcTemplate
或 SimpleJdbcCall
来完成此操作,但是对于这些,我什至无法达到使用普通旧式 JDBC 可以做到的程度。
总而言之,我想避免最终出现:
{ call getFooBar(?,null,null,null,null,null,?,null,null) }
使用 JDBC 或更好的 Spring 可以吗?
不是最有效的解决方案,但是,您是否尝试过将普通语句本身与 EXEC 一起使用。
例如。
String mySql = "EXEC getFooBar @Foo='FOO', @Bar='BAR'";
ResultSet rs = conn.getConnection().createStatement().executeQuery(mySql);
您需要 simpleJdbc 接口。
所以你的代码看起来像这样:
SimpleJdbcCall getFooBar = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("getFooBar");
MapSqlParameterSource getFooBarParams = new MapSqlParameterSource()
.addValue("Foo", Foo)
.addValue("Bar", "Bar")
Map<String, Object> output = getFooBar.execute(getFooBarParams );