2013-01-20 3 views
0

임시 테이블을 사용하는 저장 프로 시저를 사용하여 특정 제품 범주 내의 모든 제품의 판매를 요약 할 수 있습니다. 코드를 실행하려고 시도했지만 실패했습니다. 나는 google과 여기 stackoverflow 검색하지만 내가 잘못한 것을 찾을 수 없습니다. Windows Server에서 MySQL 서버 5.5를 사용하고 있습니다.MySQL의 임시 테이블 정의

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; 
+0

당신이 어떤 오류를받을 수 있나요? 첫 번째 작업이 끝나기 전에이 절차를 두 번 실행하면 아마도 임시 테이블을 만들 수 없습니다.) – cichy

+0

다음 오류가 발생합니다. 1064 - SQL 구문에 오류가 있습니다. 가까운 구문을 사용하려면 MySQL 서버 버전과 일치하는 매뉴얼을 확인하십시오 ') BEGIN CREATE TEMPORARY TABLE procResult (productName VARCHAR, amount INT); 'at line 1' – Feanaro

+0

절차를 만들 때 실패했습니다. 하지만 네가 실제로 맞다. – Feanaro

답변

1
  1. 당신은 당신의 저장 프로 시저에 categoryName 매개 변수로 VARCHAR 형태 변수의 길이를 정의해야합니다;

  2. DECLARE 다른 모든 명령보다 먼저 BEGIN ... END compound statement block의 시작 부분에 모든 로컬 변수가 있어야합니다.

  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