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 가 발생합니다. |