我正在尝试从我的存储过程中获取结果,而我正在获取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);
}
答案 0 :(得分:2)
如果您只是在SQL Server Management Studio(SSMS)中运行存储过程
exec rptGetAssetbyLocation '2122'
然后你可能不需要搞乱输出参数,你可以只使用一个输入参数来调用你的存储过程,然后从结果集中检索结果,就像这样
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
}
答案 1 :(得分:2)
除了the answer by Gord Thompson之外,您还可以将JDBC调用转义用于存储过程。
JDBC转义是JDBC标准中定义的非常特定的转义,用于弥合SQL实现之间的差异。 JDBC转义转换为数据库服务器特定语法。
对于调用存储过程,转义是:
{call procname(arg1, ..,)}
或具有返回值的存储过程:
{? = procname(arg1, ...)}
其中arg1
等是文字值或参数占位符。请参阅CallableStatement
apidoc。在准备或执行时,驱动程序会将其转换为数据库语法(例如,在SQL服务器的情况下为EXEC procname arg1, ...
)。
您尝试在问题中使用的语法是JDBC转义({...}
)和执行存储过程的SQL Server特定语法之间的混合。
此外,存储过程的结果可能不是out参数,而是ResultSet
,但这取决于存储过程定义。