我在 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);
关于sql - 如何使用 JDBC 调用带有命名参数的 Sybase 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20718199/