반응형
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
반응형
'sourcecode' 카테고리의 다른 글
시작일부터 종료일까지 매주 플래너 이벤트 표시 (0) | 2022.09.21 |
---|---|
서로 다른 두 데이터베이스의 테이블 간에 결합하시겠습니까? (0) | 2022.09.21 |
속성별로 동일한 개체 인스턴스 비교 (0) | 2022.09.21 |
MySQL: 테이블이 여러 개입니까, 열이 많은 테이블이 한 개입니까? (0) | 2022.09.21 |
라라벨로 mysql에 접속하려면 어떻게 해야 하나요? (0) | 2022.09.21 |