Một cái gì đó như thế này sẽ thực hiện một mẹo nhỏ (Tuy nhiên, hãy đọc sau đoạn mã để biết thêm thông tin)
CREATE PROCEDURE GetFilteredData()
BEGIN
DECLARE bDone INT;
DECLARE var1 CHAR(16); -- or approriate type
DECLARE Var2 INT;
DECLARE Var3 VARCHAR(50);
DECLARE curs CURSOR FOR SELECT something FROM somewhere WHERE some stuff;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
DROP TEMPORARY TABLE IF EXISTS tblResults;
CREATE TEMPORARY TABLE IF NOT EXISTS tblResults (
--Fld1 type,
--Fld2 type,
--...
);
OPEN curs;
SET bDone = 0;
REPEAT
FETCH curs INTO var1,, b;
IF whatever_filtering_desired
-- here for whatever_transformation_may_be_desired
INSERT INTO tblResults VALUES (var1, var2, var3 ...);
END IF;
UNTIL bDone END REPEAT;
CLOSE curs;
SELECT * FROM tblResults;
END
Một số điều cần xem xét ...
Liên quan đến đoạn mã trên:
- có thể muốn chuyển một phần truy vấn đến Thủ tục đã lưu trữ, có thể đặc biệt là tiêu chí tìm kiếm, để làm cho nó chung chung hơn.
- Nếu phương thức này được gọi bởi nhiều phiên, v.v. có thể muốn chuyển một ID phiên theo kiểu sắp xếp để tạo tên bảng tạm thời duy nhất (thực sự là mối quan tâm không cần thiết vì các phiên khác nhau không chia sẻ cùng một không gian tên tệp tạm thời; xem nhận xét của Gruber, bên dưới)
- Một số phần như khai báo biến, truy vấn SELECT, v.v. cần được chỉ định chính xác
Tổng quát hơn: cố gắng tránh cần con trỏ .
Tôi cố tình đặt tên cho biến con trỏ là curs [e], bởi vì con trỏ là một sự may mắn hỗn hợp. Chúng có thể giúp chúng ta triển khai các quy tắc nghiệp vụ phức tạp có thể khó diễn đạt ở dạng khai báo của SQL, nhưng sau đó nó đưa chúng ta sử dụng dạng thủ tục (mệnh lệnh) của SQL, đây là một tính năng chung của SQL không thân thiện lắm / biểu cảm, khôn ngoan về lập trình và thường kém hiệu quả hơn về hiệu suất.
Có thể bạn có thể xem xét việc thể hiện sự chuyển đổi và lọc mong muốn trong ngữ cảnh của một truy vấn SQL "thuần túy" (mang tính khai báo).