2013-02-12 80 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()}")