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

问题描述 投票:0回答:2

我在 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 可以吗?

sql spring stored-procedures jdbc sap-ase
2个回答
3
投票

不是最有效的解决方案,但是,您是否尝试过将普通语句本身与 EXEC 一起使用。
例如。

String mySql = "EXEC getFooBar @Foo='FOO', @Bar='BAR'"; 
ResultSet rs = conn.getConnection().createStatement().executeQuery(mySql);


0
投票

您需要 simpleJdbc 接口。

所以你的代码看起来像这样:

SimpleJdbcCall getFooBar = new SimpleJdbcCall(jdbcTemplate)
            .withProcedureName("getFooBar");

MapSqlParameterSource getFooBarParams = new MapSqlParameterSource()
            .addValue("Foo", Foo)
            .addValue("Bar", "Bar")


Map<String, Object> output = getFooBar.execute(getFooBarParams );
© www.soinside.com 2019 - 2024. All rights reserved.