DB2存储过程游标加载疑问:是否预加载所有结果集?
DB2多游标存储过程的结果集加载机制解答
你好,针对你的疑问,直接给结论:执行这个存储过程时,只会加载对应输入条件的那个结果集,另外两个游标对应的查询根本不会被执行,自然也不会占用内存。
原因其实很简单,DB2里的DECLARE CURSOR语句只是定义游标的结构和关联的查询逻辑,这个阶段并不会实际执行SELECT语句或者把数据加载到内存里。只有当你执行OPEN语句的时候,DB2才会去解析、执行对应的查询,然后生成并返回结果集。
看你的代码逻辑:
Declare c1 CURSOR WITH RETURN FOR select * from table,...... -- joins and filters; Declare c2 CURSOR WITH RETURN FOR select * from table,...... -- joins and filters ; Declare c3 CURSOR WITH RETURN FOR select * from table,...... -- joins and filters ; -- 过程末尾的条件判断 IF (input_value="employees") THEN OPEN c1; ELSEIF (input_value="management") THEN OPEN c2; ELSEIF (input_value="admin") THEN OPEN c3; END IF;
这里三个游标只是做了声明,只有满足input_value条件的那个游标会被OPEN,对应的SELECT查询才会被触发执行,结果集才会被加载。另外两个游标因为没被打开,它们的查询逻辑完全不会被执行,也就不会有数据被加载到内存里。
举个类比的话,就像你提前写了三个不同的查询脚本,但只有符合条件的那个脚本才会被运行,另外两个一直躺在那里没动,自然不会消耗资源。
内容的提问来源于stack exchange,提问作者Danyal Sandeelo
相关产品推荐
相关产品推荐

