Получение выходных данных хранимых процедур MySQL с помощью QSqlQuery

У меня есть сервер MySQL и работает. Содержит базу данных с процедурами. Это один из них:

CREATE PROCEDURE `handshake` ()
BEGIN
DECLARE `is_new` INT;
SELECT `value` INTO `is_new` FROM `Defaults` WHERE `key` = 'new_db';
SELECT (SELECT CASE
WHEN `is_new` = 1 THEN 1
WHEN `is_new` = 0 THEN 0
WHEN `is_new` = NULL THEN -1
ELSE -2
END) AS 'state';
END

Он работает через MySQL Workbench и возвращает таблицу из одного столбца (состояния) с одной строкой значения 1. Но когда я пытаюсь использовать это так:

QSqlQuery test_query(test_db);
if (test_query.prepare("CALL handshake();")) {
qDebug() << "one";
if (test_query.exec()) {
qDebug() << "two";
if (test_query.first()) {
qDebug() << "Yay!";
}
else {
qDebug() << test_query.isValid() << test_query.size() << test_query.lastError().text();
}
}
}

это возвращает:

ложь -1 «»

что означает: недействительно и нет записей, но нет ошибок …
Я пытался гуглить, но безуспешно. Есть ли QSqlQuery хотя бы поддержать это? Я мог бы создать параметр OUT и «ВЫБЕРИТЕ CASE в него», но я хочу создать другие процедуры с таблицами возврата, а не только отдельные параметры …

2

Решение

Процедура возвращает пустоту. Он имеет только роль обработки. Вы должны использовать выходной параметр для вашей процедуры:

create procedure handshake (OUT state INT)
BEGIN
SELECT `value` INTO `is_new` FROM `Defaults` WHERE `key` = 'new_db';
set state = (SELECT CASE
WHEN `is_new` = 1 THEN 1
WHEN `is_new` = 0 THEN 0
WHEN `is_new` = NULL THEN -1
ELSE -2
END);
END

И вы можете вызвать процедуру и прочитать значение как:

QSqlQuery q;
q.exec("call handshake (@outval1)");
q.exec("select @outval1");
q.next();
qDebug() << q.value(0);
0

Другие решения


По вопросам рекламы [email protected]