sourcecode

Java에서 SQL을 실행할 때 SQL 구문의 오류가 발생했지만 HeidiSQL에서는 발생하지 않음

copyscript 2023. 9. 6. 22:14
반응형

Java에서 SQL을 실행할 때 SQL 구문의 오류가 발생했지만 HeidiSQL에서는 발생하지 않음

테이블에 삽입 또는 업데이트를 실행하려고 합니다. 아래에서 생성된 문자열은 HeidiSQL에 복사를 붙여넣으면 정상적으로 작동하지만 다음과 같이 처리됩니다.SQLSyntaxErrorExceptionsJava에서 실행할 경우:

Statement statement = con.createStatement();
String escapedXML = EscapeString(billboard.getXml());
String sql = String.format(
    "DELIMITER $ \r\nBEGIN NOT ATOMIC\r\n" +
    "IF EXISTS(SELECT * FROM billboards where Name='%s') THEN UPDATE billboards SET XML='%s' where Name='%s';\r\n" +
    "ELSE insert into billboards(Name, XML, CreatorName) values('%s', '%s', '%s');\r\n" +
    "END IF;\r\n" +
    "END $\r\n" +
    "DELIMITER ;", billboard.getName(), escapedXML, billboard.getName(), billboard.getName(), escapedXML, billboard.getCreatorName());
// Insert or update billboard
statement.execute(sql);

왜 그런지 모르겠어요.

를 사용하는 것을 추천합니다.insert ... ok duplicate key코드 블록이 아닌 구문입니다.이것이 더 효율적이며, php 코드에서 쿼리를 실행할 때 발생하는 문제를 피할 수 있는 단일 문 잠금을 구현합니다.

insert into billboards(Name, XML, CreatorName) 
values(?, ?, ?)
on duplicate key update set XML = values(XML)

이 작업을 수행하려면 열에 고유한(또는 기본 키) 제약 조건이 필요합니다.Name.

또한 쿼리 문자열에 변수를 연결하는 것보다 매개 변수화된 쿼리를 사용하는 것을 고려하십시오. W 탈출은 비효율적이며 코드를 안전하게 만들지 않습니다.

당신은 노력했어야 합니다.NamedParameterStatement문자열 매개 변수의 설정을 용이하게 하고 중복을 방지하기 위한 쿼리(GMB의 이전 답변에서 제안된 리팩터된 쿼리 사용):

String sql = "INSERT INTO billboards (Name, XML, CreatorName) VALUES (:name, :xml, :creator) "
             + "ON DUPLICATE KEY UPDATE SET XML = :xml";

NamedParameterStatement statement = new NamedParameterStatement(con, sql);
statement.setString("name", billboard.getName());
statement.setString("xml", EscapeString(billboard.getXml()));
statement.setString("creator", billboard.getCreatorName());

// Insert or update billboard
statement.execute(sql);

구문 오류가 발생하는 이유는DELIMITER는 MySQL 클라이언트 명령어이며 SQL 문이 아닙니다.MySQL 명령은 JDBC와 함께 사용할 수 없습니다.

자세한 내용:

언급URL : https://stackoverflow.com/questions/62100573/error-in-sql-syntax-when-running-sql-in-java-but-not-in-heidisql

반응형