Множественный запрос к MySQL - это запрос, содержащий несколько выражений, записанных через ; Для того, чтобы его провести, при установке соединения нужно указать флаг CLIENT_MULTI_STATEMENTS. Как-то вот так:
mysql_real_connect(mysql, host, user, pwd, db, port, socket, CLIENT_MULTI_STATEMENTS);
Этот флаг так же ставит CLIENT_MULTI_RESULTS. Соответственно, теперь можно будет использовать. Осталось только получить результаты их выполнения. Главная - не забыть, что возвращаются результаты последовательно с каждого выражения, а не только с тех ,кто эти результаты может вернуть. Это, в общем-то, логично, дает возможность узнать, например, количество строк, затронутое каждым из выражений.
Получаются они функцией mysql_store_result, как обычно. Но она будет вызываться ко всем выражениям по очереди. Пролистывать результаты выполнения можно функцией mysql_next_result.
В итоге: вызовом mysql_next_result пропускаем выражения, ничего не возвращающие, у возвращающих - забираем данные с помощью mysql_store_result:
if (mysql_query(mysql, "CALL my_proc(@a, @b); SELECT @a, @b;") != NULL) {
if (mysql_next_result(mysql)) > 0)
cout << "mysql_next_result error" << endl;
MYSQL_RES *result = mysql_store_result(mysql);
if (result) {
...
mysql_free_result(result);
}
else
cout << "mysql_store_result error" << endl;
}
else
cout << "mysql_query error" << endl;
Если неизвестно, возвращает ли что-нибудь выражение - можно проверить командой mysql_field_count.
Информация - из документации.
mysql_real_connect(mysql, host, user, pwd, db, port, socket, CLIENT_MULTI_STATEMENTS);
Этот флаг так же ставит CLIENT_MULTI_RESULTS. Соответственно, теперь можно будет использовать. Осталось только получить результаты их выполнения. Главная - не забыть, что возвращаются результаты последовательно с каждого выражения, а не только с тех ,кто эти результаты может вернуть. Это, в общем-то, логично, дает возможность узнать, например, количество строк, затронутое каждым из выражений.
Получаются они функцией mysql_store_result, как обычно. Но она будет вызываться ко всем выражениям по очереди. Пролистывать результаты выполнения можно функцией mysql_next_result.
В итоге: вызовом mysql_next_result пропускаем выражения, ничего не возвращающие, у возвращающих - забираем данные с помощью mysql_store_result:
if (mysql_query(mysql, "CALL my_proc(@a, @b); SELECT @a, @b;") != NULL) {
if (mysql_next_result(mysql)) > 0)
cout << "mysql_next_result error" << endl;
MYSQL_RES *result = mysql_store_result(mysql);
if (result) {
...
mysql_free_result(result);
}
else
cout << "mysql_store_result error" << endl;
}
else
cout << "mysql_query error" << endl;
Если неизвестно, возвращает ли что-нибудь выражение - можно проверить командой mysql_field_count.
Информация - из документации.
Комментариев нет:
Отправить комментарий