WEB开发网
开发学院数据库Oracle Oracle 中使用 fetch bulk collect into 批量效率... 阅读

Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据

 2009-05-12 13:13:51 来源:WEB开发网   
核心提示: --声明需要集合类型及变量,参照字段的 type 来声明类型 type contacts_type is table of sr_contacts%rowtype; v_contacts contacts_type; cursor all_contacts_cur is --用 rown

--声明需要集合类型及变量,参照字段的 type 来声明类型

  type contacts_type is table of sr_contacts%rowtype;
  v_contacts contacts_type;

cursor all_contacts_cur is --用 rownum 来限定取出的记录数来测试

     select * from sr_contacts where rownum <= 10000;

begin
   
    open all_contacts_cur;
    loop
        fetch all_contacts_cur bulk collect into v_contacts limit 256;
        for i in v_contacts.first .. v_contacts.last loop --遍历集合
            --用 v_contacts(i).sr_contact_id/v_contacts(i).contact_phone/v_contacts(i).remark
            --的形式来取出各字段值来执行你的业务逻辑
            null; --这里只放置一个空操作,只为测试循环取数的效率
        end loop;
        exit when all_contacts_cur%notfound;
    end loop;
    close all_contacts_cur;
end;

关于 limit 参数

你可以根据你的实际来调整 limit 参数的大小,来达到你最优的性能。limit 参数会影响到 pga 的使用率。而且也可以在 fetch bulk 中省略 limit 参数,写成

fetch all_contacts_cur bulk collect into v_contacts;

有些资料中是说,如果不写 limit 参数,将会以数据库的 arraysize  参数值作为默认值。在 sqlplus 中用 show arraysize  可以看到该值默认为 15,set arraysize 256 可以更改该值。而实际上我测试不带 limit 参数时,外层循环只执行了一轮,好像不是 limit 15,所以不写 limit 参数时,可以去除外层循环,begin-end 部分可写成:

上一页  1 2 3 4 5 6 7  下一页

Tags:Oracle 使用 fetch

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接