티스토리 뷰
[원글 - 2014년 이글루스]
C용 mysql 라이브러리 이용해서 Manager 만들면서 시행착오 겪었던 것 정리 (추후 업데이트 할지도??) ( Connection을 계속 유지한다는 가정 하에!! )
1. PROCEDURE 호출 시 주의사항!!!
다음과 같은 상황에서 발생합니다 Multiple Statement 옵션 ( CLIENT_MULTI_STATEMENTS
) 을 지정한 상태에서 아래와 같은 프로시져를 호출한다
CALL MY_PROCEDURE( @pRETVAL ); SELECT @pRETVAL;
MY_PROCEDURE는 내부적으로 업데이트를 처리한 후 pRETVAL
에 결과 값을 저장한다
이 때 실질적으로 Result Set은 SELECT @pRETVAL;
하나만 존재하기 때문에
바로 mysql_store_result()
를 통해서 Result Set을 가져오려고 시도를 하는데
이 경우 mysql_store_result()
함수는 NULL
을 리턴한다 (Result Set이 없다고 리턴!!)
mysql_error()
도 성공으로 뜬다
이 경우 Statement는 총 2개가 된다
프로시져 내부적으로 Result Set을 갖는 구문 (SELECT
)가 없다 하더라도
프로시져 호출 자체적으로 비어있는 Result Set을 하나 가지고 있다
따라서 SELECT @pRETVAL;
에 대한 Result Set을 가져오려면
mysql_next_result()
로 프로시져 Call 에 대한 빈 Result Set을 무시하고
다음 Result Set을 가져와야 한다
만일 MY_PROCEDURE
안에 SELECT
문이 있다면?
SELECT
문의 수 + 1 만큼의 mysql_next_result()
호출이 있어야 한다
+1 이 바로 프로시져 Call 에 의한 빈 Result Set
!!!여기서 중요하게 생각해야 하는 부분이 하나 더 있습니다!!! 그렇다면 그냥 PROCEDURE()
만 호출해 봅시다
CALL MY_PROCEDURE();
이 경우에 만약 mysql_next_result()
처리를 하지 않으면 어떻게 될까요?
라이브러리 단에서 fetch 해야 할 result set이 남아있다는 판단 하에...
out of sync 에러를 던져버립니다!!!
mysql_ping()
도 out of sync 에러를 던져버리기 때문에
sql 실행 전에 접속 체크를 위해서 mysql_ping()
쳐보면 에러 떨어집니다
주의하고 또 주의합시다!!!
'개발 관련 정리 (구 블로그에서 백업) > 기타' 카테고리의 다른 글
[DirectX] Windows SDK 와 헤더 인쿨르드 (0) | 2018.11.26 |
---|---|
[WEB] JS Event (0) | 2018.11.26 |
[MAYA 6.5] MEL 스크립트 이용해서 폴리곤 정보 추출하기 - 정점 + UV (0) | 2018.11.26 |
[MAYA 6.5] MEL 스크립트 이용해서 폴리곤 정보 추출하기 - 정점과 인덱스 (0) | 2018.11.26 |