«Неправильный синтаксис рядом с '{'» при вызове хранимой процедуры SQL Server
-
21-12-2019 - |
Вопрос
Я пытаюсь получить результаты из моей хранимой процедуры и получаю 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'
.
Тогда вам, вероятно, вам, вероятно, не нужно беспокоить параметры вывода, вы можете просто использовать один параметр ввода, чтобы вызвать сохраненную процедуру, а затем извлечь результаты подобных результатов
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
}
. Другие советы
В дополнение к ответ Горда Томпсона, вы также можете использовать escape-вызов JDBC для хранимых процедур.
Экранные экраны JDBC — это очень специфические экранные экраны, определенные в стандарте JDBC для устранения различий между реализациями SQL.Экранирующие символы JDBC преобразуются в синтаксис, специфичный для сервера базы данных.
Для вызова хранимых процедур выход:
{call procname(arg1, ..,)}
или для хранимой процедуры с возвращаемым значением:
{? = procname(arg1, ...)}
Где arg1
и т.д. — это либо буквальное значение, либо заполнитель параметра.См. CallableStatement
апидок.При подготовке или выполнении драйвер преобразует это в синтаксис базы данных (т. е. EXEC procname arg1, ...
в случае SQL-сервера).
Синтаксис, который вы пытались использовать в своем вопросе, представляет собой смесь escape-последовательности JDBC ( {...}
) и специфический синтаксис SQL Server для выполнения хранимой процедуры.
Кроме того, результатом вашей хранимой процедуры, вероятно, является не выходной параметр, а ResultSet
, но это зависит от определения хранимой процедуры.