개요
애플리케이션에서 statement 를 핸들링할 때 이미 open 되어 있는 커서를 다시 재사용할 때 발생하는 에러입니다.
버전
ALTIBASE HDB 4 이상
HDB 4.3.9 Error Message 매뉴얼이나 altierr 유틸리티로 Invalid cursor state. 에 대한 설명을 확인할 수는 없지만 HDB 4.3.9 에서도 이 에러가 발생할 수 있습니다.
현상
- APRE(또는 SESC)에서 CURSOR FETCH 중 CURSOR DECLARE 또는 CURSOR OPEN 수행 시 Invalid cursor state 발생.
- APRE(또는 SESC)에서 CURSOR FETCH 후 CURSOR DECLARE 또는 CURSOR OPEN 수행 시 Invalid cursor state 발생.
- SQLCLI 또는 ODBC에서 SQLFetch() 수행 중 SQLExecute(), SQLPrepare(), SQLExecDirect() 중 한 가지 수행 시 Invalid cursor state 발생.
- SQLCLI 또는 ODBC에서 SQLFetch() 수행 후 SQLExecute(), SQLPrepare(), SQLExecDirect() 중 한 가지 수행 시 Invalid cursor state 발생.
원인 및 조치
1. FETCH 완료 후 커서 CLOSE 하지 않고 같은 이름의 커서를 재사용한 경우
HDB 5 이상 버전에 해당하는 내용입니다. HDB 4 버전에서는 이와 같은 경우 에러가 발생하지 않습니다.
- 간혹 커서 CLOSE 를 수행하지 않고 같은 이름의 커서를 재사용하여 에러가 발생하는 경우도 있습니다.
예제 코드
- 이 원인에 해당하는 경우 커서 CLOSE 구문을 추가합니다.
2. FETCH 완료 후 커서 CLOSE 실패 시 예외 처리를 누락한 경우
- 커서 CLOSE 가 실패했는데 예외 처리를 하지 않아서 커서 CLOSE 실패 사실을 모르고 같은 이름의 커서를 재사용하는 경우입니다.
- HDB 5 이상 버전에 해당하는 내용입니다. HDB 4 버전에서는 이와 같은 경우 에러가 발생하지 않습니다.
예제 코드
- 이 원인에 해당하는 경우 커서 CLOSE 구문에 예외 처리를 추가하고 커서 CLOSE 가 실패한 원인이 무엇인지 파악합니다.
3. FETCH 할 데이터가 결과가 남아 있는 상태에서 커서를 재사용한 경우
- DB 서버에 FETCH 할 데이터가 남아있는 경우 커서 CLOSE 할 때 그 결과가 삭제해버립니다.
다시 말하면 FETCH 할 데이터가 삭제되기 전까지는 같은 이름의 커서를 재사용할 수 없습니다. 재사용하려 한다면 커서를 OPEN 후에 FETCH 해야 함. 예제 코드
예제1예제2- 이 원인에 해당하는 경우 커서 CLOSE 구문을 추가 후 커서를 재사용하도록 합니다.