SQL/RDBMS

java.sql.SQLSyntaxErrorException: ORA-00911: 문자가 부적합합니다

dddzr 2023. 3. 14. 09:38

 

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마다 감싸는 특수기호가 달라서 발생한 문제였다.

 

오라클의 경우는 "로 감싸야한다.

https://sumni.tistory.com/96

 

[MySQL/MARIADB, MSSQL, ORACLE] DB별 예약어나 특수문자가 포함된 컬럼명 표현, 네이밍 규칙

각 데이터베이스 관리 시스템에서는 예약어(reserved keyword)나 특수문자가 포함된 컬럼명을 사용할 수 있지만 , 해당 이름을 직접 참조하거나 쿼리하는 경우 문제가 발생할 수 있습니다. 따라서 DB

sumni.tistory.com

 

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);