JDBC使用返回值和输入/输出参数执行SQL Server存储过程

时间:2013-02-12 14:14:27

标签: sql-server stored-procedures jdbc

我有一个存储过程,它接受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'在'='

之前出现

这让我没有任何想法,因为它无论如何都不起作用。

有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

调用存储过程的语法是:

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

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

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

,我希望它能够正常工作
CallableStatement cstmt = conn.prepareCall("{?=call spName(?, ?, ?)}");

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

答案 1 :(得分:0)

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

this.connection.prepareCall("{call dbo.storedProcedure()}")