像这样的东西应该做的伎俩(但是,在片段之后阅读更多信息)
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要考虑的一些事情......
关于上面的代码:
可能希望将部分查询传递给存储过程,尤其是搜索条件,以使其更通用。
如果要通过多个会话调用此方法,则可能希望传递排序的会话ID以创建唯一的临时表名称(实际上不必要的关注,因为不同的会话不共享相同的临时文件命名空间;请参阅注释格鲁伯,下面)
需要正确指定一些部分,例如变量声明,SELECT查询等
UL>
更一般地说:试图避免需要游标。
我故意命名游标变量curs [e],因为游标是混合的祝福。它们可以帮助我们实现可能难以用SQL的声明形式表达的复杂业务规则,但它然后使我们使用SQL的过程(命令式)形式,这是SQL的一般特性,它既不是非常友好/富有表现力,编程方面,性能往往效率低下。
也许你可以考虑在“普通”(声明性)SQL查询的上下文中表达所需的转换和过滤。