如何使用 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 JdbcTemplateSimpleJdbcCall 来执行此操作,但对于那些我什至无法达到使用普通旧 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 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel中无任何顺序地调用带有命名参数的sp

带有 PL SQL 表类型参数的 Oracle 存储过程的 JDBC 调用

在 JDBC PL/SQL 块中多次使用命名参数时出错

使用 NHibernate 作为带有输入参数的命名查询调用存储过程

带有输入参数的 Oracle JDBC 调用 PL/SQL 过程记录表

如何在带有jooq的普通sql中使用命名参数