2

我有一个存储过程,它接受 1 个输入值、2 个输出参数并在执行时返回一个值

在互联网上,我看到了使用 Call 的参考资料

CallableStatement cstmt = conn.prepareCall("{call ? = spName(?, ?, ?)}");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.setObject(2, Types.INTEGER);
cstmt.registerOutParameter(3, Types.NVARCHAR);
cstmt.registerOutParameter(4, Types.NVARCHAR);

但这给了我错误

"Incorrect syntax near '{'"

然后我决定像 SQL Management Studio 生成的 SQL 代码一样:

CallableStatement cstmt = conn.prepareCall("exec ? = spName ?, ?, ?");
cstmt.registerOutParameter(1, Types.INTEGER);
cstmt.setObject(2, Types.INTEGER);
cstmt.registerOutParameter(3, Types.NVARCHAR);
cstmt.registerOutParameter(4, Types.NVARCHAR);

但这给了我错误

"Incorrect syntax near '='"

我认为这是因为查询被转换为

"exec @P1 OUT = spName @P2, @P3 OUT, @P4 OUT" 

它在 SQL Management Studio 上也不起作用,因为 'OUT' 出现在 '=' 之前

这让我没有想法,因为这两种方式都行不通。

有什么建议么?

谢谢!

4

2 回答 2

4

调用存储过程的语法是:

{[?=]call procedure-name[([parameter][,[parameter]]...)]}

因此,您的第一个示例在 JDBC 调用转义的解析器中触发了一个异常,因为您将其放在call了返回值之前。我不确定第二个问题。

因此,如果您将第一个示例修改为:

CallableStatement cstmt = conn.prepareCall("{?=call spName(?, ?, ?)}");

您可以在 MSDN 上找到专门针对 Microsoft JDBC 驱动程序的更多信息:

于 2013-02-12T20:08:09.080 回答
0

此外,对于没有任何参数的存储过程,它看起来就像......

this.connection.prepareCall("{call dbo.storedProcedure()}")
于 2015-06-23T17:48:38.287 回答