【问题标题】:Temporary table definition in MySQLMySQL中的临时表定义
【发布时间】:2013-01-20 17:26:21
【问题描述】:

我有一个使用临时表的存储过程,以便我可以汇总某个产品类别中所有产品的销售额。当我尝试运行代码时它失败了。我在谷歌和 stackoverflow 上搜索,但找不到我做错了什么。我在 Windows Server 上使用 MySQL server 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;

【问题讨论】:

  • 您遇到什么错误?如果您在第一个结束之前运行此过程两次,那么您可能无法创建临时表;)
  • 我收到以下错误:1064 - You have an error in your SQL syntax; check the manual that corresponds with yout MySQL server version for the right syntax to use near ') BEGIN CREATE TEMPORARY TABLE procResult(productName VARCHAR, amount INT); ' at line 1
  • 好吧,它在尝试创建过程时失败了。但其实你是对的……

标签: mysql sql stored-procedures temp-tables


【解决方案1】:
  1. 您必须为您的存储过程定义VARCHAR类型变量的长度,例如categoryName参数;

  2. 您必须在 BEGIN ... END compound statement block 的最开始处 DECLARE 所有局部变量,在任何其他命令之前;

  3. CREATE TABLE ... SELECT 的语法不正确;

  4. 您为同一个 SQL 条件声明了两个处理程序,其中只有一个将被执行 (indeterminately);

  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
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多