という名前のテーブルがありますcode
。
p_code
列は親のコードです
そして、ストアド プロシージャは、次のように結合された一連のレコードを返す必要がありp_code
ます。
この手順は、初回以外は正常に機能します (MYSQL に再接続した後、null が返されます!)。どうしたの?
これがストアドプロシージャです。
BEGIN
DECLARE _CODE bigint(20);
DECLARE _P_CODE bigint(20);
DECLARE _SORT bigint(20);
DECLARE _pre_P_CODE bigint(20);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @CODE = NULL;
SET _P_CODE = @CODE;
SET _CODE = '';
SET _SORT = 0;
SET _pre_P_CODE = '';
IF @CODE IS NULL THEN
RETURN NULL;
END IF;
LOOP
SELECT CODE, P_CODE, SORT, CODE_NAME, CODE_LEVEL
INTO @CODE, @P_CODE, @SORT, @CODE_NAME, @CODE_LEVEL
FROM CODE
WHERE LANGUAGE = @LANGUAGE
AND P_CODE = _P_CODE
AND SORT > _SORT
ORDER BY SORT limit 1;
IF @CODE IS NOT NULL OR _P_CODE = @start_with THEN
SET @level = @level + 1;
RETURN @CODE;
END IF;
SET @level := @level - 1;
SELECT CODE, P_CODE, SORT
INTO _CODE, _P_CODE, _SORT
FROM CODE
WHERE CODE = _P_CODE;
END LOOP;
END
そして、プロシージャはこのように呼び出されました。この SQL は、上の 2 番目の画像を返します。
SELECT
menu_connect_by_p_code() AS CODE,
@level as level,
@P_CODE as p_code,
@SORT as sort,
@CODE_NAME as CODE_NAME,
@CODE_LEVEL as CODE_LEVEL
FROM (
SELECT
@start_with := 6001,@LANGUAGE := 'en' ,
@CODE := @start_with,
@level := 0
) vars, code
WHERE @CODE IS NOT NULL
最初に null を返す理由がわかりません。MYSQL の手順やバグのようなもので何か問題がありますか?
- - - - - - - - - - - - - - - - 編集 - - - - - - - - - ------------------
RolandoMySQLDBA、rsanchez、あなたのオプションを試しましたが、同じままです。複数の行を返し、一部の列は null です。
------------------------------- edit2 ------------------ ------------------
ここで見ることができます:http://sqlfiddle.com/#!2/aa033/1