0

特定の製品カテゴリ内のすべての製品の売上を要約できるように、一時テーブルを使用するストアドプロシージャがあります。コードを実行しようとすると失敗しました。私はグーグルとここスタックオーバーフローで検索しましたが、私が間違ったことを見つけることができませんでした。WindowsServerでMySQLサーバー5.5を使用しています。

CREATE PROCEDURE `getStatistics`(IN `startDate` date,IN `endDate` date,IN  `categoryName` varchar)
BEGIN
    CREATE TEMPORARY TABLE procResult(productName VARCHAR, amount INT);
    CREATE TEMPORARY TABLE tblProductID(SELECT ID, `name` FROM product WHERE categoryID = (SELECT ID FROM category WHERE `name` = categoryName));
    DECLARE done_amt, done_PID INT DEFAULT FALSE;
    DECLARE amount, productID INT DEFAULT 0;
    DECLARE pidCursor CURSOR FOR SELECT ID, `name` FROM tblProductID;
    DECLARE amtCursor CURSOR FOR SELECT orderlines.amount FROM orderlines WHERE orderlines.productID = productID;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done_amt = TRUE;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done_PID = TRUE;

    OPEN pidCursor;

    pid_loop:LOOP
        DECLARE productName VARCHAR;
        FETCH pidCursor INTO productID, productName;

        IF done_PID THEN
            LEAVE pid_LOOP;
        END IF;

        OPEN amtCursor;

        amt_loop:LOOP
            DECLARE tmpAmount INT DEFAULT 0;
            FETCH amtCursor INTO tmpAmount;

            IF done_amt THEN
                LEAVE amt_loop;
            END IF;

            amount = amount + tmpAmount;
        END LOOP;

        CLOSE amtCursor;

        IF amount > 0 THEN
            INSERT INTO procResult VALUES (productName, amount);
            amount = 0;
        END IF;
    END LOOP;

    CLOSE pidCursor;
END;
4

1 に答える 1

1
  1. ストアド プロシージャVARCHARのパラメータなど、型変数の長さを定義する必要があります。categoryName

  2. 他のコマンドの前に、複合ステートメント ブロックDECLAREの最初にすべてのローカル変数を配置する必要があります。BEGIN ... END

  3. の構文CREATE TABLE ... SELECTが正しくありません。

  4. 同じ SQL 条件に対して 2 つのハンドラーを宣言しましたが、そのうちの 1 つだけが実行されます (不確定)。

  5. プロシージャ本体内に表示されるセミコロンがステートメントを終了しないことをクライアントが理解できるように、クライアントのステートメント区切り文字を変更する必要がありますCREATE PROCEDURE

  6. 手順全体は、SQL でかなり単純なタスクを実行するための非常に複雑な方法です。

    CREATE TEMPORARY TABLE procResult
      SELECT   product.name, SUM(orderlines.amount) AS amount
      FROM     orderlines
          JOIN product  ON  product.ID = orderlines.productID
          JOIN category ON category.ID = product.categoryID
      WHERE    category.name = ?
      GROUP BY product.ID
      HAVING   amount > 0
    
于 2013-01-20T18:12:13.497 に答える