2015-04-13 4 views
2

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

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 ""

, что означает: не выписывается на nd нет записей, но ошибок нет ... Я пытался сделать это, но не повезло. QSqlQuery даже поддерживает это? Я могу создать параметр OUT и «SELECT CASE in it», но я хочу создать другие процедуры с таблицами возврата, а не только с одним параметром ...

ответ

0

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

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); 
Смежные вопросы