Sesuatu seperti ini akan berhasil (Namun, baca setelah cuplikan untuk info lebih lanjut)
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
Beberapa hal yang perlu dipertimbangkan...
Tentang cuplikan di atas:
- mungkin ingin meneruskan sebagian kueri ke Prosedur Tersimpan, mungkin khususnya kriteria penelusuran, untuk membuatnya lebih umum.
- Jika metode ini dipanggil oleh beberapa sesi, dll., mungkin ingin melewatkan semacam ID Sesi untuk membuat nama tabel sementara yang unik (sebenarnya tidak perlu khawatir karena sesi yang berbeda tidak berbagi ruang nama file sementara yang sama; lihat komentar oleh Gruber, di bawah)
- Beberapa bagian seperti deklarasi variabel, kueri SELECT, dll. perlu ditentukan dengan benar
Secara umum:mencoba menghindari kebutuhan kursor .
Saya sengaja menamai variabel kursor curs[e], karena kursor adalah berkah campuran. Mereka dapat membantu kita menerapkan aturan bisnis yang rumit yang mungkin sulit untuk diungkapkan dalam bentuk deklaratif SQL, tetapi kemudian membawa kita untuk menggunakan bentuk prosedural (imperatif), yang merupakan fitur umum SQL yang tidak terlalu ramah/ ekspresif, dari segi pemrograman, dan seringkali kurang efisien dari segi kinerja.
Mungkin Anda dapat melihat ekspresi transformasi dan pemfilteran yang diinginkan dalam konteks kueri SQL "polos" (deklaratif).