![](/img/trans.png)
[英]Microsoft SQL Server JPA Stored Procedure com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '{'
[英]“Incorrect syntax near '{'” calling SQL Server stored procedure
我正在嘗試從存儲過程中獲取結果,並且出現ERROR: Incorrect syntax near '{'.
。 我看到許多示例對sql string
使用相同的東西,但我不確定為什么會出錯..我有相同數量的參數...
當我像這樣在數據庫中執行存儲過程時
exec rptGetAssetbyLocation '2122
我得到了5列
如何使用Callable Statement返回結果? 我用registerOutParameter
做錯了什么?
try
{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url = "jdbc:sqlserver:...";
String username = "username";
String password = "password";
sb.append("<table id=\"examplee\" border=1 >"
+ "<tr><td>ID</td><td>TAG</td><td>NAME</td>"
+ "<td>MODEL</td><td>SERIAL NUMBER</td></tr>");
String query = "{exec rptGetAssetbyLocation(?,?,?,?,?)}";
Connection conn = DriverManager.getConnection(url, username, password);
CallableStatement stmt = conn.prepareCall(query);
stmt.registerOutParameter(1, java.sql.Types.INTEGER);
stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
stmt.registerOutParameter(3, java.sql.Types.VARCHAR);
stmt.registerOutParameter(4, java.sql.Types.VARCHAR);
stmt.registerOutParameter(5, java.sql.Types.VARCHAR);
ResultSet rs = stmt.executeQuery();
while (rs.next())
{
int id = rs.getInt("ID");
String tag = rs.getString("tag");
String name = rs.getString("name");
String model = rs.getString("model");
String serNum = rs.getString("serialNumber");
sb.append("<tr><td>" + id + "</td>"
+ "<td>" + tag + "</td>"
+ "<td>" + name + "</td>" +
"<td>" + model + "</td>" +
"<td>" + serNum + "</td></tr>");
}
sb.append("</table>");
}
catch(Exception e)
{
sb.append("<h1>ERROR: " + e.getMessage() + "</h1>");
}
sb.append("</body></html>");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(sb);
}
如果您要做的所有在SQL Server Management Studio(SSMS)中運行存儲過程的操作,
exec rptGetAssetbyLocation '2122'
那么您可能不需要弄亂輸出參數,只需使用一個輸入參數來調用存儲過程,然后像這樣從ResultSet中檢索結果
String query = "exec rptGetAssetbyLocation ?";
Connection conn = DriverManager.getConnection(url, username, password);
CallableStatement stmt = conn.prepareCall(query);
stmt.setString(1, "2122");
ResultSet rs = stmt.executeQuery();
while (rs.next())
{
int id = rs.getInt("ID");
String tag = rs.getString("tag");
String name = rs.getString("name");
String model = rs.getString("model");
String serNum = rs.getString("serialNumber");
// ...and do other useful stuff
}
除了Gord Thompson的回答之外,您還可以將JDBC調用轉義用於存儲過程。
JDBC轉義是JDBC標准中定義的非常特殊的轉義,用於消除SQL實現之間的差異。 JDBC轉義被轉換為數據庫服務器特定的語法。
對於調用存儲過程,轉義為:
{call procname(arg1, ..,)}
或對於具有返回值的存儲過程:
{? = procname(arg1, ...)}
其中arg1
等是文字值或參數占位符。 請參閱CallableStatement
apidoc。 在准備或執行后,驅動程序會將其轉換為數據庫語法(例如,對於SQL Server,為EXEC procname arg1, ...
)。
您在問題中嘗試使用的語法是JDBC轉義( {...}
)和執行存儲過程的SQL Server特定語法之間的混合。
同樣,存儲過程的結果可能不是out參數,而是ResultSet
,但這取決於存儲過程的定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.