2013-07-30 37 views
15

Tôi đã tìm kiếm những giờ cuối cùng hoặc lâu hơn và đã không tìm thấy một câu trả lời thuyết phục cho vấn đề dường như đơn giản này:Làm thế nào để sử dụng đầu ra Bảng từ lưu trữ MYSQL Thủ tục

Làm thế nào để bạn gọi một hàm MYSQL lưu trữ/thủ tục và sử dụng đầu ra của nó trong các truy vấn SELECT nữa?


Mặc dù đây rõ ràng không hoạt động, đây là loại điều tôi muốn có:

SELECT P.`id` FROM (CALL test_proc()) AS P 

đâu test_proc() được xác định bởi:

DROP PROCEDURE IF EXISTS test_proc; 
DELIMITER ;; 
CREATE PROCEDURE test_proc() 
BEGIN 
    SELECT * FROM `table`; 
END;; 
DELIMITER ; 

Như một ví dụ. Tôi sẽ ổn với việc sử dụng một chức năng được lưu trữ là tốt.

Trả lời

17

Điều này không thể thực hiện được, trực tiếp, bởi vì đầu ra của một lựa chọn không bị chặn trong một thủ tục lưu sẵn là tập hợp kết quả được gửi tới máy khách, nhưng không phải là bảng.

Giải pháp thay thế là để cho proc đưa dữ liệu vào bảng tạm thời sau khi tạo bảng cho bạn. Bảng này sẽ chỉ có sẵn cho kết nối của bạn khi thủ tục kết thúc. Nó sẽ không gây ra xung đột nếu ai đó chạy proc cùng một lúc và sẽ không hiển thị với bất kỳ kết nối nào khác.

Thêm phần này vào các thủ tục:

DROP TEMPORARY TABLE IF EXISTS foo; 
CREATE TEMPORARY TABLE foo SELECT ... your existing select query here ...; 

Khi làm thủ thuật kết thúc, SELECT * FROM foo; sẽ cung cấp cho bạn những gì bạn những gì bạn đã có thể nhận từ proc. Bạn có thể tham gia vào nó khá giống với bất kỳ bảng nào.

Khi bạn hoàn tất, hãy thả nó hoặc thiết bị sẽ tự biến mất khi bạn ngắt kết nối. Nếu bạn chạy lại proc, nó sẽ bị xóa và tạo lại.

+0

Chúc mừng, đó chính xác là những gì tôi đang tìm kiếm :) – Johannes

+0

Làm cách nào tôi có thể gọi test_proc() trong khi tạo bảng tạm thời. Tôi muốn giữ logic trong SP riêng biệt và không muốn kết hợp các câu lệnh chọn với bảng tạm thời –

+0

@HimalayaGarg hãy giải thích ý bạn là gì * trong khi tạo "* - bạn có ý nghĩa gì đó' TẠO TẠO TEMPORARY t1 SỬ DỤNG KẾT QUẢ TỪ CALL test_proc() '? Xin lỗi, tôi vừa mới làm vậy. Không có cú pháp như vậy. Hãy giải thích những gì bạn đang cố gắng làm. –

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