如何使用 JDBC 调用带有命名参数的 Sybase 存储过程
Posted
技术标签:
【中文标题】如何使用 JDBC 调用带有命名参数的 Sybase 存储过程【英文标题】:How to call Sybase stored procedure with named params using JDBC 【发布时间】:2013-12-21 10:51:22 【问题描述】:我在 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 吗?
【问题讨论】:
【参考方案1】:不是最有效的解决方案,但是,您是否尝试过将普通语句本身与 EXEC 一起使用。
例如。String mysql = "EXEC getFooBar @Foo='FOO', @Bar='BAR'";
ResultSet rs = conn.getConnection().createStatement().executeQuery(mySql);
【讨论】:
以上是关于如何使用 JDBC 调用带有命名参数的 Sybase 存储过程的主要内容,如果未能解决你的问题,请参考以下文章
带有 PL SQL 表类型参数的 Oracle 存储过程的 JDBC 调用
使用 NHibernate 作为带有输入参数的命名查询调用存储过程