如何使用JDBC调用带有命名params的Sybase存储过程

时间:2013-12-21 10:51:22

标签: sql spring stored-procedures jdbc sybase-ase

我在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 JdbcTemplateSimpleJdbcCall执行此操作,但是对于那些我甚至无法使用普通旧JDBC进行操作的人。

总而言之,我想避免最终:

{ call getFooBar(?,null,null,null,null,null,?,null,null) }

可以使用JDBC或更好的Spring吗?

1 个答案:

答案 0 :(得分:1)

不是最有效的解决方案,但是,您是否尝试过使用简单声明本身EXEC 例如,
String mySql = "EXEC getFooBar @Foo='FOO', @Bar='BAR'"; ResultSet rs = conn.getConnection().createStatement().executeQuery(mySql);