簡體   English   中英

MySQL錯誤1064:存儲過程

[英]MySQL Error 1064 : Stored procedure

謝謝,這是工作

這是在這兩行:

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” “:”價值“}

數據的類型(動作(連接,在牆上發布))它是我們的儀表板應用程序之一的表名

“數據”是可用數據的列表

在我們擁有數據之后

您必須在select語句中添加SQL_CALC_FOUND_ROWS ,以便FOUND_ROWS()函數起作用。

所以改變這一行

DECLARE entryCursor CURSOR FOR SELECT entryValue, entryTime FROM TrackingEntry;

像這樣

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

你可以在這里閱讀更多相關信息。

問題可以是用一個准備好的INSERT語句,似乎其中一個變量是NULL。 嘗試評論准備好的語句並選擇@query,你會看到問題 -

SET @query = CONCAT('INSERT INTO ',_entryType, ' (',valueName,') VALUES (',valueValue,')' );
SELECT @query;
-- PREPARE stmt FROM @query;
-- EXECUTE stmt;
-- DEALLOCATE PREPARE stmt;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM