我在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')
在所有这些情况下,我从DB获得异常,告诉我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吗?
答案 0 :(得分:1)
不是最有效的解决方案,但是,您是否尝试过使用简单声明本身EXEC
例如,
String mySql = "EXEC getFooBar @Foo='FOO', @Bar='BAR'";
ResultSet rs = conn.getConnection().createStatement().executeQuery(mySql);