2015년 6월 5일 금요일

MySQL - Commands out of sync; you can't run this command now

예를들어….
memset(query, 0x00, QUERYSIZ);
sprintf(query, “DROP PROCEDURE IF EXISTS mytable; CREATE TABLE IF NOT EXISTS mytable ( Term VARCHAR(255) NOT NULL, KeyNo int DEFAULT 0, UNIQUE (Term)););
state1 = mysql_query(conn, query);

memset(query, 0x00, QUERYSIZ);
sprintf(query, "SELECT * FROM mytable ( 생략... );");
state2 = mysql_query(conn, query);

이런쿼리를 실행했다. 헌데 두번째 쿼리서..
Commands out of sync; you can’t run this command now

위와 같은 에러가 보였다. 뭐지?! 이 에러는 쿼리 실행 후 resource가 발생하였는데 이를 mysql_free_result() 나 mysql_use_result()등으로 처리없이 막바로 다른 실행을 진행하였을 때 발생한다.

mysql_query()는 SELECT, SHOW, DESCRIBE, EXPLAIN, 결과셋을 반환하는 기타 구문에서 성공시 resource를, 오류시 FALSE를 반환한다. 또한 다른 형식의 SQL 구문, 즉, INSERT, UPDATE, DELETE, DROP 등에서는 성공하면 TRUE를, 실패하면FALSE를 반환한다.

따라서 DROP과 CREATE를 실행한 위 구문은 문제가 없다고 생각했다. 헌데..

https://dev.mysql.com/doc/refman/5.0/en/commands-out-of-sync.html

B.5.2.14 Commands out of sync
If you get Commands out of sync; you can't run this command nowin your client code, you are calling client functions in the wrong order.
This can happen, for example, if you are using mysql_use_result() and try to execute a new query before you have called mysql_free_result(). It can also happen if you try to execute two queries that return data without calling mysql_use_result() or mysql_store_result()in between.

라고하더라;;;;

두개의 쿼리(멀티쿼리)를 동시 질의한 경우에도 마찬가지라는 소리다.
그러면, CLIENT_MULTI_STATEMENTS 옵션은 당췌 무슨소용인가?!?!

물론 위의 쿼리를 두개로 분할하여 질의하면 문제는 사라진다. 하지만 멀티쿼리를 꼭 써야하는 경우, 이 문제를 어떻게 풀어야 할까?


아 궁금하다;;;;;;;;;;;;


댓글 없음:

댓글 쓰기