石家庄专业模板网站制作价格,有哪些网站做二手房好的,一级a做爰片_相关网站,用户注册页面html代码通常我们获取游标数据是用fetch some_cursor into var1, var2 的形式#xff0c;自 Oracle 8i 起#xff0c;Oracle 为我们提供了fetch bulkcollect 来批量取游标中的数据#xff0c;它能在读取游标中大量数据的时候提升效率#xff0c;采用bulkcollect可以将查询结果一次性…通常我们获取游标数据是用fetch some_cursor into var1, var2 的形式自 Oracle 8i 起Oracle 为我们提供了fetch bulkcollect 来批量取游标中的数据它能在读取游标中大量数据的时候提升效率采用bulkcollect可以将查询结果一次性地加载到collections中。而不是通过cursor一条一条地处理。BulkCollect批查询在某种程度上可以提高查询效率它首先将所需数据读入内存然后再统计分析这样就可以提高查询效率。但是如果Oracle数据库的内存较小SharedPool Size不足以保存Bulk Collect批查询结果那么该方法需要将BulkCollect的集合结果保存在磁盘上在这种情况下Bulk Collect方法的效率会较低fetch bulkcollect into 的使用格式是fetch some_cursor bulk collect into col1, col2limit xxx。col1、col2 是声明的集合类型变量xxx 为每次取数据块的大小(记录数)相当于缓冲区的大小可以不指定limit xxx 大小。测试实例--1000000行数据使用批量fetch方式执行时间1sdeclaretype id_type is table ofemp.EMPNO%type;v_idid_type;type name_type is table ofemp.ENAME%type;v_namename_type;type sal_type is table ofemp.SAL%type;v_salsal_type;cursor all_empisselect empno,ename,sal from emp2where rownum 1000000;beginopenall_emp;loopfetch all_emp bulk collect intov_id,v_name,v_sal limit256;for i in 1..v_id.countloopnull;endloop;exit whenall_emp%notfound;endloop;close all_emp;end;--1000000行数据使用逐行fetch方式执行时间11sdeclarev_idemp2.EMPNO%type;v_nameemp2.ename%type;v_salemp2.sal%type;cursor all_empisselect empno,ename,sal from emp2where rownum 1000000;beginopenall_emp;loopfetch all_emp intov_id,v_name,v_sal;exit whenall_emp%notfound;null;endloop;close all_emp;end;几点说明1、 从测试结果来看游标的记录数越大时用 fetch bulkcollect into 的效率很明显示趋于很小时就差不多了。2、 可以在select into,fetchinto,returning into语句使用bulk collect。3、 在使用bulkcollect时所有的into变量都必须是collections4、 在这个例子中我们借助于集合的 first、last、count 来进行遍历。5、 关于 limit 参数6、 你可以根据你的实际来调整 limit参数的大小来达到你最优的性能。limit 参数会影响到 pga 的使用率。而且也可以在 fetch bulk 中省略 limit参数写成fetch all_contacts_cur bulk collect intov_contacts;不写 limit 参数时可以去除外层循环begin-end 部分可写成beginopenall_emp;fetch all_emp bulk collect intov_id,v_name,v_sal;for i in 1..v_id.countloopnull;endloop;close all_emp;end;除了BulkCollect批查询外我们还可以使用FORALL语句来实现批插入、删除和更新这在大批量数据操作时可以显著提高执行效率使用FORALL比FOR效率高因为前者只切换一次上下文而后者将是在循环次数一样多个上下文间切换。--FOR用法 9sDECLARETYPE ID_TYPE IS TABLE OFEMP.EMPNO%TYPE;V_IDID_TYPE;TYPE NAME_TYPE IS TABLE OFEMP.ENAME%TYPE;V_NAMENAME_TYPE;TYPE SAL_TYPE IS TABLE OFEMP.SAL%TYPE;V_SALSAL_TYPE;CURSOR ALL_EMPISSELECT EMPNO,ENAME,SAL FROM EMP2WHERE ROWNUM 200000;BEGINOPENALL_EMP;FETCH ALL_EMP BULK COLLECT INTOV_ID,V_NAME,V_SAL;FOR I IN 1..V_ID.COUNTLOOPinsert into t(id)values(V_ID(i));ENDLOOP;CLOSE ALL_EMP;END;--FORALL用法 5SDECLARETYPE ID_TYPE IS TABLE OFEMP.EMPNO%TYPE;V_IDID_TYPE;TYPE NAME_TYPE IS TABLE OFEMP.ENAME%TYPE;V_NAMENAME_TYPE;TYPE SAL_TYPE IS TABLE OFEMP.SAL%TYPE;V_SALSAL_TYPE;CURSOR ALL_EMPISSELECT EMPNO,ENAME,SAL FROM EMP2WHERE ROWNUM 200000;BEGINOPENALL_EMP;FETCH ALL_EMP BULK COLLECT INTOV_ID,V_NAME,V_SAL;FORALL I IN1..V_ID.COUNTinsert into t(id)values(V_ID(i));CLOSE ALL_EMP;END;