티스토리 뷰

[원글 - 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() 쳐보면 에러 떨어집니다


주의하고 또 주의합시다!!!

댓글
최근에 올라온 글
Total
Today
Yesterday
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31