오류 발생
긴 길이의 QString 데이터를 CLOB column에 insert 하자, ORA-03113 "end of file on communication channel"
오류가 발생하였다.
원인 파악
ORA-03113
과 관련된 문서를 찾아보니, 현재 상황과 맞는 뚜렷한 원인을 파악하기 힘들었다.
오류가 발생한 쿼리를 조사해 본 결과 CLOB column에 data insert를 하는 쿼리가 동작하는 부분이었다.
해당 부분은 아래와 같이 QSqlQuery
를 통해 prepared statement를 통하여 string을 CLOB Column에 insert(또는 update) 하는 로직이다.
QString text = "blah~ blah~~~~ ...."; // 긴 길이의 텍스트
QSqlQuery query(m_db);
query.prepare("insert into A(longdata) values(:longdata)");
query.bindValue(":longdata", QVariant(text));
query.exec();
위와 같이 prepared statement를 정의하고, data를 bind한 뒤, 쿼리를 실행해본 결과 처음 몇개의 쿼리는 정상적으로 INSERT 되었으나, 어느순간부터 ORA-03113
에러 발생 후 ORA-03114(Not connected to Oracle)
메시지가 지속적으로 발생하였다.
지속적으로 디버깅 한 결과, String의 길이가 일정이상 늘어나게 되면 해당 부분에서 오류가 발생하는 것이다.
문제 해결
혹시나 놓치고 있는 부분이 무엇인지 찾기위해 다음과 같은 행위를 수행했다.
- Column의 Type 변경 (CLOB -> LONG)
- 하나의 테이블에 하나의 LONG 컬럼만 정의 가능
- Query 실행 로직 변경
- 뚜렷한 방안을 찾기 어려움
- SQL 문에서 insert시 CLOB을 별도로 처리해야하는가?
- (정답) to_clob을 사용
여러 행위를 수행해본 결과, insert 시에 data를 clob형으로 변경하여 수행할 경우 문제 없이 데이터가 insert되는것을 확인하였다.
#이전 query
insert into A(longdata) values(:longdata)
#수정후 query
insert into A(longdata) values(to_clob(:longdata))
결론
정확한 해결 방안인지는 모르겠으나 insert 또는 update를 수행할 때 길이가 긴 string을 바로 bind해서 처리할 경우 EOF문제가 발생하며, 이를 해결하기 위해 to_clob
을 사용하여 형변환이 필요하다.
또한 CLOB 데이터를 사용하기 위해 별도로 코드를 변경할 필요가 없었다.
'Programming > QT' 카테고리의 다른 글
[QT] Windows에서 QOCI (Oricle DB) Driver 빌드 (0) | 2021.09.10 |
---|---|
[QT] CentOS 7 환경에서 QOCI (Oracle DB) Driver 빌드 (0) | 2021.06.28 |
[QT] static assertion failed: Type is not registered, please use the Q_DECLARE_METATYPE (0) | 2019.06.25 |
[QT] C++ std::string과 QString 간의 문자열 형 변환 방법 (0) | 2019.06.18 |
[QT] QObject::connect: Cannot queue arguments of type 'Type Name' (0) | 2019.06.12 |
[QT] QByteArray를 QJsonValue로 변환하기 (0) | 2019.05.16 |
[QT] QDockWidget의 위치 및 상태 저장 (1) | 2019.05.14 |
[QT] 프로그램 실행 시 모니터 지정 및 풀스크린 실행 (0) | 2019.05.09 |