0

ありがとう、仕事だ

この2行にありました:

SET valueName = CONCAT(valueName, ' ,', _valueSplit);
SET valueValue = CONCAT(valueValue,' ,', json(_entryData, _valueSplit));

変数を宣言しましたが、NULL の場合、CONCAT は NULL を返し、クエリは NULL に進みます

私を助けてくれたDevartに感謝します


ポスト :

ストアド プロシージャを使用しようとすると、このエラーが発生します

call _extract() Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1

しかし、この私の手順には何も表示されませんが、命令NULLはありません

CREATE PROCEDURE _extract()
BEGIN
    DECLARE _entryType VARCHAR(45);
    DECLARE _entryData VARCHAR(1024);
    DECLARE _entryTime BIGINT(20);

    DECLARE no_more_rows BOOLEAN;
    DECLARE num_rows INT DEFAULT 0;

    DECLARE entryCursor CURSOR FOR SELECT entryValue, entryTime FROM TrackingEntry;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;

    OPEN entryCursor;
    select FOUND_ROWS() into num_rows;

    mainLoop: LOOP

        FETCH entryCursor INTO _entryData, _entryTime;

        IF no_more_rows THEN
            CLOSE entryCursor;
            LEAVE mainLoop;
        END IF;

        SET _entryType = json(_entryData, "type");
        CALL split_string(json(_entryData, "data"), ",");
        CALL _extractJson(_entryType, _entryData);

    END LOOP mainLoop;
END$$

_extractJson プロシージャ: データ抽出の次の部分

CREATE PROCEDURE _extractJson(`_entryType` VARCHAR(255))
BEGIN

    DECLARE _valueSplit VARCHAR(255);

    DECLARE valueName VARCHAR(255);
    DECLARE valueValue VARCHAR(255);

    DECLARE split_no_more_rows BOOLEAN;
    DECLARE split_num_rows INT DEFAULT 0;

    DECLARE splitCursor CURSOR FOR SELECT SQL_CALC_FOUND_ROWS _value FROM SplitValues;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET split_no_more_rows = TRUE;

    OPEN splitCursor;
    select FOUND_ROWS() into split_num_rows;
    dataLoop: LOOP
        FETCH splitCursor INTO _valueSplit;
        IF split_no_more_rows THEN
            CLOSE splitCursor;
            LEAVE dataLoop;
        END IF;

        SET valueName = CONCAT(valueName, ' ,', _valueSplit);
        SET valueValue = CONCAT(valueValue,' ,', json(_entryData, _valueSplit));

    END LOOP dataLoop;
    SET @query = CONCAT('INSERT INTO ',_entryType, ' (',valueName,') VALUES (',valueValue,')' );
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    --end stuffs here
END$$

やりたいことを説明する

一部のデータは trackingEntry に保存され、各行にはユーザーが何をしたか (ソーシャル ゲームで)、どこから来たか (アクション、リファラー、その他の値) に関する情報が含まれています。

これらのデータは次のような Json 形式で保存されます: { "type" : "tableName", "data" : "row1,row2,row3", "row1" : "value", "row2" : "value", "row3 " : "価値" }

データのタイプ (アクション (接続、ウォールへの公開)) ダッシュボード アプリケーションの 1 つのテーブルの名前

「データ」は利用可能なデータのリストです

データを取得した後

4

2 に答える 2

1

関数が機能するSQL_CALC_FOUND_ROWSように、select ステートメントを追加する必要があります。FOUND_ROWS()

したがって、この行を変更します

DECLARE entryCursor CURSOR FOR SELECT entryValue, entryTime FROM TrackingEntry;

このような

DECLARE entryCursor CURSOR FOR SELECT SQL_CALC_FOUND_ROWS entryValue, entryTime FROM TrackingEntry;

詳細については、こちらをご覧ください。

于 2012-06-08T11:24:24.910 に答える
1

問題は、準備された INSERT ステートメントにある可能性があります。変数の 1 つが NULL のようです。準備されたステートメントにコメントを付けて @query を選択すると、問題が発生します -

SET @query = CONCAT('INSERT INTO ',_entryType, ' (',valueName,') VALUES (',valueValue,')' );
SELECT @query;
-- PREPARE stmt FROM @query;
-- EXECUTE stmt;
-- DEALLOCATE PREPARE stmt;
于 2012-06-08T12:55:50.730 に答える