同一連接調用存儲過程,第一次成功,第二次報「不能執行 query」。
存儲過程返回多個結果集(即使只有 1 個也會有一個空結果集作為結束標記)。C API 要求在同一連接發起新請求前,必須用 mysql_next_result() 循環讀取並釋放所有結果集,否則協議層面殘留數據導致下一次請求失敗。
MYSQL *conn = pool_get();
mysql_query(conn, "CALL sp_name()");
MYSQL_RES *res = mysql_use_result(conn);
while ((row = mysql_fetch_row(res))) { /* 處理第一個結果集 */ }
mysql_free_result(res);
while ((res = mysql_next_result(conn)) != NULL) {
/* 處理/忽略後續結果集 */
mysql_free_result(res);
}
pool_put(conn);
若連接池已在歸還前自動清理殘留結果集,上層業務可無感知;否則必須在業務代碼中顯式循環。