문제 발생 

스프링으로 @Scheduled를 실행하려고 했는데 ORA-01002: fetch out of sequence라는 오류가 떴다. 코드를 아무리 봐도 틀린 게 없고.. 저 오류가 뭘까 찾아보았다. 

 

오류 정의 

ORA-01002: fetch out of sequence

Oracle 데이터베이스에서 발생하는 오류로서, 일련의 결과 집합에서 데이터를 검색하려고 할 때 순서가 맞지 않는 경우에 발생한다. 이 오류는 주로 JDBC(Java Database Connectivity)나 SQL*Plus 등을 사용하여 Oracle 데이터베이스에 연결하고 작업할 때 나타난다.

 

흠.. 오케이 근데 fetch가 뭔데...? 

fetch는 커서에서 원하는 결과값을 추출하는 동작을 나타내며 커서는 쿼리문에 의해서 반환되는 결괏값들을 저장하는 메모리 공간이다.  Oracle 데이터베이스에서 결과 집합을 순서대로 가져올 때는 각 행을 순차적으로 처리하는 것이 중요하다. 만약 데이터를 가져오는 순서가 예상과 다르거나, 이전에 가져온 데이터가 아직 처리되지 않은 상태에서 다음 데이터를 가져오려고 하면 이 오류가 발생하게 된다. 

 

발생 원인 

찾아보니 이 오류는 주로 다음과 같은 상황에서 발생한다고 한다. 

  • ResultSet 순서 문제: 데이터를 검색하는 ResultSet이나 Cursor를 사용하는 경우에 발생할 수 있다. 예를 들어, 어떤 데이터를 검색하고 그다음에 다른 데이터를 검색하려고 할 때, 순서가 맞지 않으면 이 오류가 발생할 수 있다.
  • 커서 관리 문제: 데이터베이스 커서를 제대로 열고 닫지 않은 경우나, 커서의 위치를 제대로 조정하지 않은 경우에도 이 오류가 발생할 수 있다.
  • 멀티스레드 환경: 멀티스레드 환경에서 동시에 여러 스레드가 같은 ResultSet을 사용하거나 관리하는 경우에도 이 오류가 발생할 수 있다.

 

해결 

내 코드를 보니 아래 처럼 두 개의 쿼리를 @Scheduled을 통해 동시에 처리해서 발생되는 오류 같았다. 

HBService.delete(boardNum);
PGService.delByBoardNum(vo.getBoardNum());

그래서 PGService.delByBoardNum 에서 HBService.delete를 실행 하도록 하기와 같이 고쳐 주었다. 

PGService.delByBoardNum(vo.getBoardNum());
|
V
public void delByBoardNum(int boardNum) {
		dao.deleteByBoardNum(boardNum);
		HBService.delete(boardNum);
	}

 

 

'SQL Database' 카테고리의 다른 글

[SQLD] 데이터 모델과 SQL  (0) 2023.09.08
[SQLD] 데이터 모델링의 이해  (1) 2023.09.07
ORA-02292 해결 방법  (0) 2023.07.10
[Oracle] 새 접속 만들기  (1) 2023.05.14
SQL 문법 _ 오라클 9i introduction 2장 문제  (0) 2023.03.19
해니01_15