【问题标题】:"Incorrect syntax near '{'" calling SQL Server stored procedure“'{' 附近的语法不正确”调用 SQL Server 存储过程
【发布时间】:2014-05-27 15:42:27
【问题描述】:

我正在尝试从我的存储过程中获取结果,我得到了 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);
    }

【问题讨论】:

    标签: java sql-server stored-procedures jdbc callable-statement


    【解决方案1】:

    如果您在 SQL Server Management Studio (SSMS) 中运行存储过程所做的只是

    exec rptGetAssetbyLocation '2122' 
    

    那么你可能不需要弄乱输出参数,你可以只使用一个输入参数来调用你的存储过程,然后像这样从 ResultSet 中检索结果

    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
    }
    

    【讨论】:

    • 天啊!...你在哪里,所以我可以给你最大的拥抱...过去两天我一直在尝试解决这个问题,但没有运气!..谢谢你很多....
    【解决方案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,但这取决于存储过程的定义。

    【讨论】:

    • 感谢您的精彩解释,哦,我从未如此沮丧,我犯了这么多错误……当您使用 JDBC 时,您更喜欢 mysql/oracle 还是 sql server ?或者没关系……
    • 我更喜欢 firebird,但那是因为我开发了它的 JDBC 驱动程序。然而,鉴于 JDBC 标准,数据库的使用在很大程度上是可以互换的,尽管每个驱动程序和 dbms 都有自己的解释和怪癖。
    猜你喜欢
    • 2020-06-23
    • 2017-08-28
    • 2020-05-23
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多