2

MySQL サーバーを稼働させています。手順を含むデータベースが含まれています。これはそれらの1つです:

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 の 1 行を含む 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();
        }
    }
}

それは返します:

false -1 " "

つまり、有効ではなく、レコードはありませんが、エラーはありません...グーグルで検索しようとしましたが、運がありませんでした。QSqlQueryこれもサポートしていますか?OUTパラメーターと「SELECT CASEをそれに入れる」を作成できましたが、単一のパラメーターだけでなく、戻りテーブルを使用して他のプロシージャを作成したい...

4

1 に答える 1

0

プロシージャは void を返します。処理の役割しかありません。プロシージャには出力パラメータを使用する必要があります。

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);
于 2015-04-13T03:55:21.280 に答える