2013-10-18 2 views
0

독자적으로 작동하는 SELECT 문이 있으며 ~ 8000 행을 반환합니다. 커서로 저장 프로 시저에 추가하려고하지만 아무 것도 반환하지 않습니다.SELECT는 독자적으로 작동하지만 커서에 할당되면 0 행을 반환합니다.

내가 놓친 것을 발견 할 수 있습니까?

작품

SELECT a.customer, a.order_id 
FROM temp_orders a 
INNER JOIN (
    SELECT customer, MAX(order_id) AS last_order 
    FROM temp_orders 
    WHERE pay_status = 3 
     OR pay_status = 4 
    GROUP BY customer 
) AS b ON a.customer = b.customer 
     AND a.order_id = b.last_order 
WHERE pay_status = 3 
    OR pay_status = 4 
ORDER BY a.customer; 

는 더 이상 같은 이름을 가진 변수와 열 이름에 문제가 있습니다

DELIMITER // 

DROP PROCEDURE IF EXISTS get_last_orders // 
CREATE PROCEDURE get_last_orders() 

    BEGIN 

     DECLARE order_id VARCHAR(15); 
     DECLARE customer_id INT; 
     DECLARE done INT DEFAULT 0; 

     DECLARE cur1 CURSOR FOR SELECT a.customer, a.order_id 
           FROM temp_orders a 
           INNER JOIN (
            SELECT customer, MAX(order_id) AS last_order 
            FROM temp_orders 
            WHERE pay_status = 3 
             OR pay_status = 4 
            GROUP BY customer 
           ) AS b ON a.customer = b.customer 
             AND a.order_id = b.last_order 
           WHERE pay_status = 3 
            OR pay_status = 4 
           ORDER BY a.customer; 

     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

     DROP TABLE IF EXISTS temp_last_orders; 

     CREATE TABLE temp_last_orders (
      id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
      order_id VARCHAR(15) NOT NULL, 
      customer_id INT NOT NULL 
     ) ENGINE = MYISAM 
     COMMENT = 'Last paid order from each customer'; 

     OPEN cur1; 
      read_loop: LOOP 
       FETCH cur1 INTO order_id, customer_id; 
       IF done THEN 
        LEAVE read_loop; 
       END IF; 

       INSERT INTO temp_last_orders (order_id, customer_id) VALUES (order_id, customer_id); 

      END LOOP; 
     CLOSE cur1; 

    END; // 

CALL get_last_orders(); 
+0

아마 같은 이름을 가진 변수와 열 이름에 문제가있는 것입니다. 예를 들어 v_order_id 및 v_customer_id와 같이 order_id 및 customer_id 변수의 이름을 바꾸고 시도해보십시오. – Mikhail

+0

@Mikhail 좋아, 고마워! 그것이 문제였습니다. 응답으로 게시하고 동의 할 것입니다. – BadHorsie

+0

@BadHorsie Glad, 도움이 :) 답변을 추가했습니다. – Mikhail

답변

1

작동하지 않습니다. 예를 들어 v_order_id 및 v_customer_id와 같이 order_id 및 customer_id 변수의 이름을 바꾸고 시도해보십시오.

0

문제를 해결하는 또 다른 방법 :

DELIMITER // 

DROP PROCEDURE IF EXISTS get_last_orders // 
CREATE PROCEDURE get_last_orders() 

BEGIN 

    DROP TABLE IF EXISTS temp_last_orders; 

    CREATE TABLE temp_last_orders (
     id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
     order_id VARCHAR(15) NOT NULL, 
     customer_id INT NOT NULL 
    ) ENGINE = MYISAM 
    COMMENT = 'Last paid order from each customer'; 

    INSERT INTO temp_last_orders (order_id, 
            customer_id) 
    SELECT a.customer, 
      a.order_id 
    FROM temp_orders a 
    INNER JOIN (
       SELECT customer, 
         MAX(order_id) AS last_order 
       FROM temp_orders 
       WHERE pay_status = 3 
        OR pay_status = 4 
       GROUP BY customer 
       ) AS b 
      ON a.customer = b.customer 
      AND a.order_id = b.last_order 
    WHERE pay_status = 3 
     OR pay_status = 4 
    ORDER BY a.customer; 

END; // 

CALL get_last_orders(); 
관련 문제