2009-03-09 38 views
9

Tôi có một thủ tục lưu trữ MySQL với một vài con trỏ. Tôi muốn in một giá trị để gửi đầu ra trở lại cho khách hàng. SQLyog Enterprise.Làm thế nào để mô phỏng một bản in trong một thủ tục lưu trữ MySQL

Tôi đã thử khai báo một biến là TEXT và ghép nối bên trong vòng lặp nhưng điều đó không hoạt động, ít nhất không phải cách tôi cố gắng thực hiện.

DECLARE _output TEXT; 
DECLARE _ID INT DEFAULT 0; 
DECLARE cur1 CURSOR FOR SELECT ID FROM CodeID; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

OPEN cur1; 

REPEAT 
    FETCH cur1 INTO _ID; 
    IF NOT done THEN 
    SET _output = _ID; /*SEE ALT BELOW*/ 

    END IF; 
UNTIL done END REPEAT; 
CLOSE cur1; 

SELECT _output; 

Tôi đã thử:

SET _output = _output + _ID 

SET _output = CONCAT(_output,_ID) 

nhưng cả hai đều chỉ trả về NULL

SET _output = _ID; chỉ mang lại cho tôi hàng lấy ngoái. Đó là hữu ích nhưng không hoàn toàn những gì tôi muốn.

Cách tốt nhất để có mỗi đầu ra hàng được tìm nạp vào màn hình để tạo lại bản in MySQL trong Quy trình lưu trữ MySQL là gì?

Trả lời

14

Bạn đang thực hiện chính xác với lệnh SELECT _output của mình; Bất kỳ thứ gì được chọn mà không có mệnh đề INTO sẽ được trả lại cho máy khách.

Để nhận tất cả chúng, bạn có thể di chuyển SELECT vào vòng lặp (để in riêng lẻ) hoặc bạn có thể ghép chúng lại với nhau. Vấn đề với concat của bạn trở về NULL là bởi vì bạn đã không khởi tạo _output cho bất cứ điều gì vì vậy nó đã được NULL. Kết hợp bất cứ điều gì với NULL sẽ trả về NULL.

Hãy thử như sau:

DECLARE _output TEXT DEFAULT ''; 
DECLARE _ID INT DEFAULT 0; 
DECLARE cur1 CURSOR FOR SELECT ID FROM CodeID; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

OPEN cur1; 

REPEAT 
    FETCH cur1 INTO _ID; 
    IF NOT done THEN 
    SET _output = CONCAT(",", _ID); /*SEE ALT BELOW*/ 

    END IF; 
UNTIL done END REPEAT; 
CLOSE cur1; 

SELECT _output; 
+6

nên không có được 'SET _output = CONCAT (_output, "", _ID); ' Nếu không nó sẽ chỉ có ID cuối cùng – Marcus

Các vấn đề liên quan