2013-02-12 78 views
2

我有一个存储过程,需要1个输入值,2个输出参数,并返回上执行JDBC执行与返回值和输入/输出参数

值在互联网上我使用呼叫看到引用SQL Server存储过程

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'请求'='

这让我没有任何想法,因为它无法兼顾。

有什么建议吗?

谢谢!

+0

这应该是'{?=调用spName(?,?,?)}'。 – 2013-02-12 20:00:47

回答

4

调用存储过程的语法是:

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

所以因为你的返回值之前把call你的第一个例子中触发了JDBC调用逃逸的解析器异常。我不确定第二个问题。

所以我希望它,如果你修改你的第一个例子的工作:

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

您可以找到专门为MSDN上的微软JDBC驱动程序的详细信息:

+0

你是对的!它是“?= call”而不是“call?=”。多么愚蠢的我:-) 谢谢! – user2064433 2013-02-13 10:43:51

0

此外,对于不带任何参数的存储过程,它只是看起来像......

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