2012-01-04 30 views
5

tôi đang học thủ tục lưu trữ, con trỏ trong mysql và tôi vấp ngã trên đó:Rõ ràng lấy trả về NULL

delimiter // 

CREATE PROCEDURE some_func() 
BEGIN 
    DECLARE link_rewrite VARCHAR(255); 
    DECLARE link_rewrite_cursor CURSOR FOR SELECT link_rewrite FROM prod; 

    OPEN link_rewrite_cursor; 

    SET @count = 0; 

    WHILE @count < 10 DO 
     FETCH link_rewrite_cursor INTO link_rewrite; 
     SELECT link_rewrite; 
     set @count = @count + 1; 
    END WHILE; 

    CLOSE link_rewrite_cursor; 

END// 

delimiter ; 

Câu hỏi của tôi là: Tại sao CHỌN link_rewrite luôn trả về NULL (trong bảng prod có 9000 dòng). SELECT link_rewrite FROM prod trả về rất nhiều hàng (9000 hàng).

Trả lời

0

Nếu bạn chỉ muốn chọn 10 dòng đầu, làm điều này:

select link_rewrite from prod limit 10 

Đó là nhanh hơn nhiều và bạn không cần phải đi với một con trỏ.

+0

'SET' không khai báo? –

+0

@Eric Nó beacuse chọn trả về một cái gì đó (trong trường hợp này NULL) vì vậy theo ý kiến ​​của tôi nó lượt truy cập trong khi vòng lặp. Yea bạn có thể làm điều đó nhanh hơn nhiều nhưng tôi đang cố gắng tìm hiểu con trỏ và thủ tục lưu trữ. – PaulP

+0

@PaulP, những gì hiện 'chọn link_rewrite từ giới hạn prod 10' cung cấp cho bạn? Nếu đó là trường hợp, thì tôi đoán là bạn có các giá trị 'null' trong bảng (bất kể bạn có bao nhiêu hàng). – Eric

16

Bạn nên tránh sử dụng cùng một tên cho nhiều thứ khác nhau. Cụ thể, đặt tên biến khác với cột bạn đang chọn. Ví dụ: nếu bạn đổi tên biến v_link_rewrite thì có thể nó sẽ hoạt động:

delimiter // 

DROP PROCEDURE IF EXISTS some_func // 

CREATE PROCEDURE some_func() 
BEGIN 
    DECLARE v_link_rewrite VARCHAR(255); 
    DECLARE link_rewrite_cursor CURSOR FOR SELECT link_rewrite FROM prod; 

    OPEN link_rewrite_cursor; 

    SET @count = 0; 

    WHILE @count < 10 DO 
     FETCH link_rewrite_cursor INTO v_link_rewrite; 
     SELECT v_link_rewrite; 
     set @count = @count + 1; 
    END WHILE; 

    CLOSE link_rewrite_cursor; 

END// 

delimiter ; 
+0

http://bugs.mysql.com/bug.php?id=28227 –

+0

@Ike: Bạn đã cứu tôi hôm nay ;-) – Artur

+0

Cảm ơn điều này đã giải quyết được vấn đề của tôi. Trong trường hợp của tôi, tôi đã đặt tên biến giống như bí danh đã chọn, không phải tên cột thực tế. Buồn cười - Tôi nghĩ nó đẹp và gọn gàng cho tất cả chúng được đặt tên giống nhau! – scipilot