반응형
Java에서 SQL을 실행할 때 SQL 구문의 오류가 발생했지만 HeidiSQL에서는 발생하지 않음
테이블에 삽입 또는 업데이트를 실행하려고 합니다. 아래에서 생성된 문자열은 HeidiSQL에 복사를 붙여넣으면 정상적으로 작동하지만 다음과 같이 처리됩니다.SQLSyntaxErrorExceptions
Java에서 실행할 경우:
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
반응형
'sourcecode' 카테고리의 다른 글
패키지에서 powershell ps1 스크립트를 실행하는 방법.json "jun"? (0) | 2023.09.06 |
---|---|
구글 스프레드시트에 AJAX 게시 (0) | 2023.09.06 |
첫 번째 ajax 호출이 완료될 때까지 두 번째 ajax 호출 대기 금지 (0) | 2023.09.06 |
PowerShell 스크립트에서 실행 파일 .exe 파일을 생성하시겠습니까? (0) | 2023.09.06 |
mysql에 로그인할 때 사용 권한이 거부되었지만 cmd digital ocean에서 로그인할 수 있음 (0) | 2023.09.06 |