sourcecode

SQLException이 잘못된 SQL 구문으로 인해 발생함

copyscript 2022. 9. 21. 23:26
반응형

SQLException이 잘못된 SQL 구문으로 인해 발생함

저장 프로시저를 실행하고 결과를 반환하는 코드가 있습니다.

public static boolean finishOrderInteraction(int orderId, int departmentId){
        try{
            boolean result = true;
            Connection con = DriverManager.getConnection(SERVER, USER, PASSWORD);
            PreparedStatement stmt = con.prepareStatement("CALL finishOrderInteraction(?, ?, @result); SELECT @result AS Result;"); //returns true, if an SQLExeption accured during the procedure execution
            stmt.setInt(1, orderId);
            stmt.setInt(2, departmentId);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()){
                result = rs.getBoolean("Result");
            }
            con.close();
            return !result;
        }catch (SQLException e){
            Logger.Severe("Failed to update order status", e, "-");
            return false;
        }
    }

문제는 이 코드로 인해 다음과 같은 예외가 발생한다는 것입니다.

SQLException: (conn=122) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT @result AS Result' at line 1

그러나 MySql Workbench를 통해 동일한 쿼리를 시도하면 모든 것이 예상대로 작동합니다.

MySql Workbench 쿼리:

CALL finishOrderInteraction(126, 1, @result); SELECT @result AS Result;

내가 여기서 뭘 잘못하고 있는지 알 수가 없어.MySql Workbench에서는 쿼리가 작동하지만 내 메서드에서는 작동하지 않는 이유는 무엇입니까?

등록해야 합니다.OUT파라미터, 스테이트먼트의 갱신을 호출한 후 값에 액세스합니다.

public static boolean finishOrderInteraction(int orderId, int departmentId) {
    Boolean result = true;

    try {
        Connection con = DriverManager.getConnection(SERVER, USER, PASSWORD);
        CallableStatement stmt = con.prepareCall("CALL finishOrderInteraction(?, ?, ?)");
        stmt.setInt(1, orderId);
        stmt.setInt(2, departmentId);
        stmt.registerOutParameter(3, java.sql.Types.BOOLEAN);

        stmt.executeUpdate();

        result = stmt.getBoolean(1);
        con.close();
    }
    catch (SQLException e) {
        Logger.Severe("Failed to update order status", e, "-");
        return false;
    }

    return result;
}

팀 비겔라이슨의 대답 덕분에 나는 그것을 알아낼 수 있었다.구문 오류가 있었지만 이 구문 오류가 제가 원하는 결과를 얻지 못한 이유가 아니었기 때문에 예외가 약간 오해를 불러일으켰습니다.

진짜 문제점은 내가 이 컴퓨터를con.prepareStatement(...)대신con.prepareCall(...),왜냐면con.prepareCall(...)작성하다CallableStatement출력 파라미터를 등록할 수 있습니다.이 매개 변수 덕분에 두 번째 쿼리가 필요하지 않았습니다.SELECT @result AS Result;구문 오류의 원인이 된 것입니다.

결국 다음과 같은 작업 코드를 갖게 되었습니다.

public static boolean finishOrderInteraction(int orderId, int departmentId){
        try{
            Boolean result = true;
            Connection con = DriverManager.getConnection(SERVER, USER, PASSWORD);
            CallableStatement stmt = con.prepareCall("CALL finishOrderInteraction(?, ?, ?)");
            stmt.setInt(1, orderId);
            stmt.setInt(2, departmentId);
            stmt.registerOutParameter(3, Types.BOOLEAN);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()){
                result = rs.getBoolean(1);
            }
            con.close();
            return result;
        }catch (SQLException e){
            Logger.Severe("Failed to finish order interaction.", e, "-");
            return false;
        }
    }

언급URL : https://stackoverflow.com/questions/65213493/sqlexception-caused-by-incorrect-sql-syntax

반응형