FAQ
ODBC 함수, SQLFreeStmt
분류 프로그래밍 등록일 2013-07-09 조회수 4410
알티베이스 매뉴얼 [ODBC Users Manual - 4.3.9 버전]
2. ODBC 함수, SQLFreeStmt 부분을 보면 다음과 같이 4가지 옵션의 내용을 기술하고 있습니다.

다음 옵션과 함께 SQLFreeStmt()를 호출할 수 있다.
- SQL_CLOSE: stmt와 관련된 커서를 닫고 모든 보류중인
            결과들을 폐기한다. 애플리케이션은 같은 또는 다른
            변수들을 사용해 다시 SELECT 문을 수행함으로서 나중에 이
            커서를 다시 열 수 있다. 만약 어떠한 커서도 열려 있지
            않으면, 이 옵션은 애플리케이션에 대해 아무런 영향을
            주지 않는다.
- SQL_DROP: 입력 명령문 핸들과 연관된 자원이 해제되고
            핸들이 무효화된다. 열린 커서가 있는 경우 닫히고 모든
            미결인 결과가 삭제된다.
- SQL_UNBIND: 이 명령문 핸들에서 이전의 SQLBindCol()
            호출에 의해 바인드된 모든 열이 해제된다.
- SQL_RESET_PARAMS: 이 명령문 핸들에서 이전의
            SQLBindParameter() 호출에 의해 설정된 모든 매개변수가
            해제된다. 애플리케이션 변수 또는 파일 참조와 명령문
            핸들의 SQL문 매개변수 마커 사이의 연관이 깨진다.

이 중 주로 사용되는 것이 SQL_CLOSE, SQL_DROP입니다.
SQLFreeStmt(stmt, SQL_DROP):
         prepared 된 stmt(statement handle)에 대한 자원을 완전히 해제한다는 의미가 됩니다.
         즉 해당 stmt를 재사용하지 않을 때만 호출합니다.

SQLFreeStmt(stmt, SQL_CLOSE):
            $ALTIBASE_HOME/sample/SQLCLI/demo_ex2.cpp 아래 주석의 내용을 보시면
            /* SQLFreeStmt(stmt, SQL_CLOSE);
             * If a cursor fetched the last record of a result set, SQL_CLOSE can be omitted.
             * Howerver, if there are some records to be fetched by SLQFetch() and
             * SQLExecute() is re-executed,
             * invalid cusor error occurs. */
             와 같이 설명하고 있습니다.
            
             다시 말해, 검색된 데이타를 모두 Fetch 하지 않았을 경우,
             SQLFreeStmt(SQL_CLOSE) 없이 SQLExecute를 다시 실행하면 오류가 발생하고,
             Fetch를 완료했을 경우에는 SQLFreeStmt(SQL_CLOSE)가 불필요하며,
             이 경우 호출하면 DB 서버와 통신이 1회 추가되어 성능이 저하가 됩니다.

             예를들어 30건 데이터 중 20건을 Fetch하고 끝내는 경우는 SQL_CLOSE가 반드시 필요하며
             Fetch를 마지막까지 완료한 경우는 SQLFreeStmt(stmt, SQL_CLOSE);를 소스에서 제거하면
             성능 개선 효과가 있습니다.

이는 4.3.x 버전에 적용되는 내용이며
4.5.x 이상의 버전일 경우, SQLFreeStmt(stmt, SQL_CLOSE); 를 꼭 호출해야 합니다.
4.5.x 의 경우는 Fetch 결과가 없을 경우, SQLFreeStmt(SQL_CLOSE)를 호출해도 별도의 통신을 발생시키지 않으며
SQLFreeStmt(SQL_CLOSE)가 없을 경우, ODBC 스펙에 따라 Function Sequence Error 가 발생합니다.
목록