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);
    }
Était-ce utile?

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, ...)}

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top