문제

저장 프로시저에서 결과를 얻으려고 하는데 ERROR: Incorrect syntax near '{'. .나는 같은 것을 사용하는 많은 예를 보았습니다. sql string 그리고 왜 오류가 발생하는지 잘 모르겠습니다. 매개변수의 양이 동일합니다...

내 데이터베이스에서 저장 프로시저를 실행할 때 이와 같이

exec rptGetAssetbyLocation '2122' 5개의 열을 얻었습니다.

Callable 문을 사용하여 결과를 다시 얻으려면 어떻게 해야 합니까?내가 뭔가 잘못하고 있어요 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);
    }
도움이 되었습니까?

해결책

SSMS(SQL Server Management Studio)에서 저장 프로시저를 실행하기 위해 수행하는 작업이 모두 다음과 같은 경우

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
}

다른 팁

게다가 Gord Thompson의 답변, 저장 프로시저에 JDBC 호출 이스케이프를 사용할 수도 있습니다.

JDBC 이스케이프는 SQL 구현 간의 차이점을 연결하기 위해 JDBC 표준에 정의된 매우 구체적인 이스케이프입니다.JDBC 이스케이프는 데이터베이스 서버별 구문으로 변환됩니다.

저장 프로시저 호출의 경우 이스케이프는 다음과 같습니다.

{call procname(arg1, ..,)}

또는 반환 값이 있는 저장 프로시저의 경우:

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

어디 arg1 etc는 리터럴 값이거나 매개변수 자리 표시자입니다.참조 CallableStatement apidoc.준비되거나 실행되면 드라이버는 이를 데이터베이스 구문으로 변환합니다(예: EXEC procname arg1, ... SQL 서버의 경우).

귀하의 질문에 사용하려고 시도한 구문은 JDBC 이스케이프( {...}) 및 저장 프로시저를 실행하는 SQL Server 관련 구문입니다.

또한 저장 프로시저의 결과는 out 매개변수가 아닐 수도 있지만 ResultSet, 그러나 이는 저장 프로시저 정의에 따라 다릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top