"Syntaxe incorrecte près de '{'" appelant une procédure stockée SQL Server
-
21-12-2019 - |
Question
J'essaie d'obtenir les résultats de ma procédure stockée et j'obtiens ERROR: Incorrect syntax near '{'.
.J'ai vu de nombreux exemples utilisant la même chose pour un sql string
et je ne sais pas pourquoi j'obtiens une erreur..J'ai le même nombre de paramètres...
quand j'exécute ma procédure stockée dans ma base de données comme ceci
exec rptGetAssetbyLocation '2122
' Je récupère mes 5 colonnes
comment puis-je récupérer les résultats en utilisant Callable Statement ?Je fais quelque chose de mal avec un 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);
}
La solution
Si tout ce que vous faites pour exécuter votre procédure stockée dans SQL Server Management Studio (SSMS) est
exec rptGetAssetbyLocation '2122'
alors vous n'avez probablement pas besoin de jouer avec les paramètres de sortie, vous pouvez simplement utiliser le paramètre d'entrée pour appeler votre procédure stockée, puis récupérer les résultats du ResultSet comme ceci
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
}
Autres conseils
En plus de la réponse de Gord Thompson, vous pouvez également utiliser l'échappement d'appel JDBC pour les procédures stockées.
Les échappements JDBC sont des échappements très spécifiques définis dans la norme JDBC pour combler les différences entre les implémentations SQL.Les échappements JDBC sont traduits dans la syntaxe spécifique au serveur de base de données.
Pour appeler des procédures stockées, l'échappement est :
{call procname(arg1, ..,)}
ou pour une procédure stockée avec une valeur de retour :
{? = procname(arg1, ...)}
Où arg1
etc est soit une valeur littérale, soit un espace réservé de paramètre.Voir le CallableStatement
apidoc.Une fois préparé ou exécuté, le pilote traduira cela dans la syntaxe de la base de données (c'est-à-dire EXEC procname arg1, ...
dans le cas du serveur SQL).
La syntaxe que vous avez essayé d'utiliser dans votre question est un mélange entre un échappement JDBC (le {...}
) et la syntaxe spécifique à SQL Server pour l'exécution d'une procédure stockée.
De plus, le résultat de votre procédure stockée n'est probablement pas un paramètre out, mais un ResultSet
, mais cela dépend de la définition de la procédure stockée.