sourcecode

RETURN SELECT Stored Procedure 후 MySQL 변수가 손상됨

copyscript 2022. 9. 4. 21:45
반응형

RETURN SELECT Stored Procedure 후 MySQL 변수가 손상됨

필드 TEXT를 가진 데이터베이스가 있으며, 이 필드에는 JSON 문자열이 저장됩니다.이 데이터베이스는 UTF-8이며, 일반 선택을 사용하여 JSON 필드를 선택하면 저장된 것과 같은 올바른 JSON을 읽습니다.그러나 스토어드 프로시저에서는 필드를 변수에 읽어들이면 SELECT 후에 변수가 파손됩니다.

DROP PROCEDURE IF EXISTS sp_G;
DELIMITER ;;
CREATE PROCEDURE sp_G(
    OUT eCode           CHAR(5),
    OUT eDescription    TEXT,
    IN  uID             INT UNSIGNED
    )
BEGIN
    DECLARE other_right         TEXT;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        GET DIAGNOSTICS CONDITION 1
            eCode = RETURNED_SQLSTATE, eDescription = MESSAGE_TEXT;
        ROLLBACK;
    END;

    SET eCode='00000';
    SET eDescription='';

    SET other_right         = "";

    -- (...code...)
    SELECT y
    INTO other_right
    FROM X
    WHERE z=1
    -- (...code...)

    CALL SP_SaveVariableContent_to_test(other_right)
    -- IN THIS PLACE other_right is OK 
    SELECT other_right;
    CALL SP_SaveVariableContent_to_test(other_right)
    -- IN THIS PLACE other_right is WRONG
END ;;
DELIMITER ;

필드 내용:

선택 후 콘텐츠 손상:

갱신:이 저장 프로시저는 테스트용이며 변수의 내용을 '인쇄'합니다.

    CREATE PROCEDURE SP_SaveVariableContent_to_test(IN  description         TEXT)
BEGIN
        INSERT INTO tmp_prints(description) values(description);
END

해결된

나는 그것을 SELECT에서 OUTPUT 파라미터로 되돌리는 값을 변경하면서 해결한다.다음과 같이 합니다.

DROP PROCEDURE IF EXISTS sp_G;
DELIMITER ;;
CREATE PROCEDURE sp_G(
    OUT eCode           CHAR(5),
    OUT eDescription    TEXT,
    IN  uID             INT UNSIGNED,
    OUT other_right     TEXT
    )
BEGIN
    -- [DISABLED] DECLARE other_right           TEXT; [DISABLED]
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        GET DIAGNOSTICS CONDITION 1
            eCode = RETURNED_SQLSTATE, eDescription = MESSAGE_TEXT;
        ROLLBACK;
    END;
    
    SET eCode='00000';
    SET eDescription='';
    
    SET other_right         = "";

    -- (...code...)
    SELECT y
    INTO other_right
    FROM X
    WHERE z=1
    -- (...code...)

    CALL SP_SaveVariableContent_to_test(other_right)
    -- IN THIS PLACE other_right is OK 
    -- [DISABLE] SELECT other_right; [DISABLE]
    CALL SP_SaveVariableContent_to_test(other_right)
    -- IN THIS PLACE other_right is OK too :D
END ;;
DELIMITER ;

MySQL 버그인 것 같아서 Cent를 사용합니다.MariaDB 10.1을 탑재한 OS

언급URL : https://stackoverflow.com/questions/35457081/mysql-gets-corrupted-variable-after-a-return-select-stored-procedure

반응형