4

MySQL5.5のストアドプロシージャに問題があります。これは、手順が機能しなければならないテーブルです。

Table `diba`:
----------------------------------------------------
Column   | Type    | Null | Default | Links to
----------------------------------------------------
ParentID | int(11) | No   |         | articoli -> id         
ChildID  | int(11) | No   |         | articoli -> id
Quantity | int(11) | No   |
lvl      | int(11) | No   | 0            

これは手順そのものです。

DELIMITER //
CREATE PROCEDURE RenumberLevels()
DETERMINISTIC
BEGIN
DECLARE lvl_counter INT;
SET lvl_counter = 1;
UPDATE `diba` SET `diba`.`lvl` = CASE WHEN `diba`.`ParentID` IS NULL THEN 1 ELSE 0 END;
WHILE EXISTS (SELECT * FROM `diba` WHERE `diba`.`lvl` = 0) DO
UPDATE `diba` SET `diba`.`lvl` = lvl_counter +1 WHERE (SELECT `D2`.`lvl` FROM `diba` AS D2
WHERE D2.ChildID = `diba`.`ParentID`) > 0 AND `diba`.`lvl` = 0;
SET `diba`.`lvl` = lvl_counter + 1;
END WHILE;
END//
DELIMITER ;

結果のエラーは次のとおりです。 #1193 - Unknown system variable 'lvl'

この手順の何が問題になっていますか?

4

2 に答える 2

3

これは、createprocedureステートメントの正しいバージョンです

DELIMITER $$
CREATE PROCEDURE `RenumberLevels`()
DETERMINISTIC
BEGIN
  DECLARE lvl_counter INT;
  SET lvl_counter = 1;
  UPDATE `diba` SET `diba`.`lvl` = CASE WHEN `diba`.`ParentID` IS NULL THEN 1 ELSE 0 END;
  WHILE EXISTS (SELECT * FROM diba WHERE lvl = 0) DO
    CREATE TABLE dibatemp AS
      SELECT D2.lvl FROM diba AS D2 LEFT JOIN diba ON diba.ParentID=D2.ChildID;
    UPDATE diba
      SET lvl = lvl_counter +1 WHERE lvl IN (SELECT lvl FROM dibatemp) > 0 AND lvl = 0;
    DROP TABLE dibatemp;
    SET lvl_counter = lvl_counter + 1;
  END WHILE;
END$$
DELIMITER ;
于 2012-12-02T12:03:07.557 に答える
1

言う行に

SET `diba`.`lvl` = lvl_counter + 1;

私はあなたが意味したと思います

SET lvl_counter = lvl_counter + 1;
于 2012-12-01T16:19:19.193 に答える