database - 将迭代的提取替换为 BULK COLLECT

标签 database oracle plsql cursor

有一个对象类型,表由该对象组成。 所以我们开始吧:

create or replace type lpu.someobj_o as object
(      
  name VARCHAR2(75),     
  enroll_date DATE,
  id NUMBER(12)
)

CREATE OR REPLACE TYPE lpu."SOMEOBJ_T" IS TABLE OF someobj_o;

还有通用的 PL/SQL 函数 ETL principle .这是一段代码功能:

  for some_cursor_rec in some_cursor(startTime, recordInterval) loop
  open some_cur2(some_cursor_rec.name, some_cursor_rec.id);
  fetch some_cur2 into some_cursor_rec2;
  if some_cur2%rowcount > 0 then
    loop
      pipe row (
        lpu.someobj_o(
        id => some_cursor_rec2.id, 
        name => some_cursor_rec2.name, 
        enroll_date => some_cursor_rec2.enroll_date
      )
      );
      fetch some_cur2 into some_cursor_rec2;
      exit when some_cur2%notfound;
    end loop;      
  end if;
  close some_cur2;
end loop;

好的,所以问题是小性能。如何提高完成此功能的速度?我读过 BULK COLLECT 应该可以提高性能。但是我该如何在我的案例中使用它呢?我已经尝试过 BULK COLLECT 但它给了我一个错误,说集合类型是错误的。 提前致谢!真心希望得到您的帮助!

最佳答案

如果您关心性能,那么您应该开始考虑组合两个游标。

当前您在 some_cursor 中执行查询一次,并且您在游标 some_cur2 中执行查询的次数与在第一个查询中选择的行数相同。这很可能是您的性能瓶颈。

如果您将两个查询合并为一个查询并执行游标循环(只执行一次查询),那么您将自动一次批量获取 100 行,因此可能不会有真正的需要手动转换为批量抓取。

问候,
罗布。

关于database - 将迭代的提取替换为 BULK COLLECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7605660/

相关文章:

oracle - JDBC 连接默认自动提交行为

sql - Oracle SQL -> 嵌套组函数和奇怪的行为

database - 如何使用进程内迁移运行器和内存 SQLite 数据库测试流畅的迁移

java - 如何在 Spring 中发布用户列表

c++ - 如何将 Oracle DB 中的 TIMESTAMP 列转换为 C++(MFC 或 WIN32)?

sql - 如何在过程中使用ORDSYS.ORDImage更新SQL记录

json - 如何清除APEX_JSON写入的json对象

php - mysql:存储任意数据

sql - mysql JOIN 中的 ON 和 WHERE 有什么区别?

oracle - PL/SQL 匿名 block 与 PL/SQL 过程 - ORA-01418 : specified index does not exist