Pregunta

Estoy intentando obtener resultados de mi procedimiento almacenado y obtengo ERROR: Incorrect syntax near '{'. .Vi muchos ejemplos usando lo mismo para un sql string y no estoy seguro de por qué recibo un error... Tengo la misma cantidad de parámetros...

cuando ejecuto mi procedimiento almacenado en mi base de datos de esta manera

exec rptGetAssetbyLocation '2122'Recibo mis 5 columnas

¿Cómo obtengo resultados usando Callable Statement?estoy haciendo algo mal con 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);
    }
¿Fue útil?

Solución

Si todo lo que hace para ejecutar su procedimiento almacenado en SQL Server Management Studio (SSMS) es

exec rptGetAssetbyLocation '2122' 

Luego, es probable que no necesite meterse con los parámetros de salida, puede usar el parámetro de entrada para llamar a su procedimiento almacenado y luego recuperar los resultados del resultado como este

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
}

Otros consejos

Además de la respuesta de Gord Thompson, también puede utilizar el escape de llamadas JDBC para procedimientos almacenados.

Los escapes JDBC son escapes muy específicos definidos en el estándar JDBC para salvar las diferencias entre las implementaciones de SQL.Los escapes JDBC se traducen a la sintaxis específica del servidor de bases de datos.

Para llamar a procedimientos almacenados el escape es:

{call procname(arg1, ..,)}

o para un procedimiento almacenado con un valor de retorno:

{? = procname(arg1, ...)}

Dónde arg1 etc es un valor literal o un marcador de posición de parámetro.Ver el CallableStatement apidoc.Cuando esté preparado o ejecutado, el controlador traducirá esto a la sintaxis de la base de datos (es decir, EXEC procname arg1, ... en el caso del servidor SQL).

La sintaxis que intentó utilizar en su pregunta es una mezcla entre un escape JDBC (el {...}) y la sintaxis específica de SQL Server para ejecutar un procedimiento almacenado.

Además, el resultado de su procedimiento almacenado probablemente no sea un parámetro de salida, sino un ResultSet, pero esto depende de la definición del procedimiento almacenado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top