IT한 것/unix

ESQL에서 오류상황시 SQLCODE가 나오지 않는 상황

lovian 2009. 11. 13. 12:33
INFORMIX의 ESQL을 이용하여 프리컴파일, 컴파일, 링킹을 수행한다.
물론 컴파일이나 링킹은 직접 해주어도 상관없다.

내가 겪은 상황은, ESQL을 이용한 경우이다.
그리고 바로 실행파일을 만든 것이 아니고, DB관련 기능은 모두 공유 라이브러리에 모아두고 그것을 호출하도록 구성시켰다.

그러나 이게 왠일?
PREPARED STATEMENT를 만들고, CURSOR를 만들어 MULTI ROW에 대해서 FETCH를 시도했는데, 무한 루프에 빠지는 것이였다.

소스코드의 FETCH 는  SQLCODE 값이 100 즉 NOT FOUND가 나오는 것을 감지해야만 정상적인 로직을 타도록 구현되어 있다.

이상해서 디버깅을 해보았는데, SQLCODE값은 계속 0이였고, SQLSTATE는 비어있는 문자열이였다.

온갖삽질 끝에 알아낸 것은...


삽질1 이 다라고 생각했는데, 겨우 정돈이 되었다.

  1. esql -thread 옵션으로 프리컴파일링 하는 것은 의미가 없다.
  2. esql -thread 옵션으로 컴파일링을 하면 cc든 cc_r이든 gcc든 -DIFX_THREAD를 전달한다.
  3. esql -thread 옵션으로 링킹하면 멀티스레드 지원 라이브러리들이 링킹된다.
이 세가지 사실만 숙지하면 되는 내용이다.

그리고 IFX_THREAD 값으로 정의된 내용중에 중요한 부분이
.
.
.
extern struct sqlca_s sqlca;
extern long SQLCODE;
extern char SQLSTATE[];
#else /* IFX_THREAD */
extern long * ifx_sqlcode();
extern struct sqlca_s * ifx_sqlca();
#define SQLCODE (*(ifx_sqlcode()))
#define SQLSTATE ((char *)(ifx_sqlstate()))
#define sqlca (*(ifx_sqlca()))
#endif /* IFX_THREAD */
위와 값이 SQLCODE를 가져오는 매크로가 단순 변수이나 함수의 리턴값이 될 수 있다.

나에게 발생했던 문제는, 오류코드는 매크로 변수에 있는 것을 찍는데, INFORMIX는 ifx_sqlcode라는 함수에 설정하고 있으니, 서로 맞지 않은 곳을 바라보고 있었던 것이다.

하여튼 컴파일을 프리컴파일러로 해야한다는 말이다.


참고 문헌:
 INFORMIX-ESQL/C Programmer’s Manual Version 9.13