ORA-00911: 문자가 부적합합니다
다른 글을 검색해 봤을 때 쿼리문에 ;가 들어가서 에러가 나는 경우가 많다고 하는데
String sql = ""
PreparedStatement pstmt = con.prepareStatement(sql);
retVals = pstmt.executeUpdate();
pstmt.close();
INSERT INTO TABLENAME(`COL1`, `COL2`, `COL3`)
VALUES ('col1data1', 'col2data1', 'col3data1'), ('col1data2' ,'col2data2', 'col3data2'), ('col1data3' ,'col2data3', 'col3data3')
ON DUPLICATE KEY UPDATE `COL2`= VALUES(COL2), `COL3`= VALUES(COL3)
sql문을 직접 만들어 주는 과정에서 예약어와 동일한 칼럼명을 사용하기위해 `로 컬럼명을 감싸도록 했는데 DB마다 감싸는 특수기호가 달라서 발생한 문제였다.
오라클의 경우는 "로 감싸야한다.
ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다
Oracle에서는 ON DUPLICATE KEY UPDATE 구문 대신 MERGE INTO 구문을 사용합니다.
또, MySQL에서는 한 번의 쿼리로 여러 개의 행을 삽입하는 것이 가능하지만, Oracle에서는 이를 지원하지 않습니다.
대신 INSERT ALL을 사용하여 여러 개의 행을 삽입할 수 있는데 여기서는 중복 데이터 처리를 할 수 없다.
INSERT ALL 구문 사용
INSERT ALL
INTO TABLENAME("COL1", "COL2", "COL3") VALUES('col1data1', 'col2data1', 'col3data1')
INTO TABLENAME("COL1", "COL2", "COL3") VALUES('col1data2', 'col2data2', 'col3data2')
SELECT * FROM DUAL
MERGE INTO 구문 사용
MERGE INTO TABLENAME T
USING (SELECT 'col1data1' AS COL1, 'col2data1' AS COL2, 'col3data1' AS COL3 FROM DUAL
UNION ALL
SELECT 'col1data2', 'col2data2', 'col3data2' FROM DUAL
UNION ALL
SELECT 'col1data3', 'col2data3', 'col3data3' FROM DUAL) S
ON (T.COL1 = S.COL1)
WHEN MATCHED THEN
UPDATE SET T.COL2 = S.COL2, T.COL3 = S.COL3
WHEN NOT MATCHED THEN
INSERT (T.COL1, T.COL2, T.COL3) VALUES (S.COL1, S.COL2, S.COL3);
'SQL > RDBMS' 카테고리의 다른 글
[mariaDB] 제약 조건(조회, 추가, 수정, 삭제) (0) | 2023.03.17 |
---|---|
[Oracle] 제약 조건 (조회, 추가, 수정, 삭제) (0) | 2023.03.16 |
[MySQL/MARIADB, MSSQL, ORACLE] DB별 예약어나 특수문자가 포함된 컬럼명 표현, 네이밍 규칙 (0) | 2023.03.14 |
BLOB데이터 들고오기(JAVA ExecuteQuery) (0) | 2022.12.17 |
(MariaDB, MySQL)on duplicate key update(With bulk insert), insert ignore, replace into (0) | 2022.06.11 |