Programming/QT

[QT] QOCI를 이용한 CLOB 데이터 insert중 ORA-03113 (EOF) 오류 발생 대처법

후유증 2021. 6. 30. 16:40

오류 발생

긴 길이의 QString 데이터를 CLOB column에 insert 하자, ORA-03113 "end of file on communication channel" 오류가 발생하였다.

 

 

Master Note: Troubleshooting ORA-03113

Master Note: Troubleshooting ORA-03113 (Doc ID 1506805.1) Last updated on MARCH 12, 2021 Applies to: Oracle Database Exadata Express Cloud Service - Version N/A and later Oracle Database Cloud Service - Version N/A and later Oracle Database - Enterprise Ed

support.oracle.com

원인 파악

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 데이터를 사용하기 위해 별도로 코드를 변경할 필요가 없었다.