Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

 

개요

...

애플리케이션에서 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 를 수행하지 않고 같은 이름의 커서를 재사용하여 에러가 발생하는 경우도 있습니다. 
  • 예제 코드

    Code Block
    languagecpp
    declare cursor A;
    open cursor A;
    fetch cursor A;       // fetch 완료! 
    // close cursor A;    // 커서 close 처리를 안 함! 
    declare cursor A;     // 같은 이름의 커서 재사용! 
  • 이 원인에 해당하는 경우 커서 CLOSE 구문을 추가합니다. 

2. FETCH 완료 후 커서 CLOSE 실패 시 예외 처리를 누락한 경우

  • 커서 CLOSE  가 실패했는데 예외 처리를 하지 않아서 커서 CLOSE 실패 사실을 모르고 같은 이름의 커서를 재사용하는 경우입니다. 
  • HDB 5 이상 버전에 해당하는 내용입니다. HDB 4 버전에서는 이와 같은 경우 에러가 발생하지 않습니다. 
  • 예제 코드 

    Code Block
    languagecpp
    declare cursor A;
    if (  sqlca.sqlcode != SQL_SUCCESS ) {
       예외처리; 
    } 
    open cursor A;
    if (  sqlca.sqlcode != SQL_SUCCESS ) {
       예외처리; 
    }
    fetch cursor A;                                          // fetch 완료! 
    if (  sqlca.sqlcode != SQL_SUCCESS ) {
       예외처리; 
    }                                                               
     
    close cursor A;                                          //  예외처리 없음. 
    /* close cursor A 실패!! */ 
                          
    declare cursor A;
    if (  sqlca.sqlcode != SQL_SUCCESS ) {
       예외처리; 
    }
  • 이 원인에 해당하는 경우 커서 CLOSE 구문에 예외 처리를 추가하고 커서 CLOSE 가 실패한 원인이 무엇인지 파악합니다. 

3. FETCH 할 데이터가 결과가 남아 있는 상태에서 커서를 재사용한 경우 

  • DB 서버에 FETCH 할 데이터가 남아있는 경우 커서 CLOSE 할 때 그 결과가  삭제해버립니다.
    다시 말하면 FETCH 할 데이터가 삭제되기 전까지는 같은 이름의 커서를 재사용할 수 없습니다. 재사용하려 한다면 커서를 OPEN 후에 FETCH 해야 함.
  • 예제 코드

    Code Block
    title예제1
    languagecpp
    while(1)
    {   
       fetch cursor A             // FETCH 할 데이터가 남아있는 상태
       open cursor A             // FETCH 할 데이터가 남아있는 상태에서 같은 이름의 커서를 재사용한 경우 에러 발생!
    }
    Code Block
    title예제2
    languagecpp
    while(1)
    {
       SQLFetch(stmt)          // FETCH 할 데이터가 남아있는 상태
       SQLExecute(stmt)      // FETCH 할 데이터가 남아있는 상태에서 같은 이름의 커서를 재사용한 경우 에러 발생!
    }
  • 이 원인에 해당하는 경우 커서 CLOSE 구문을 추가 후 커서를 재사용하도록 합니다. 

...