1

我一直在网上搜索,我很惊讶到处都能看到同样的例子,而且总是 all_objects。不擅长高级 SQL,我不明白如何将此语句转换为使用 BULK_COLLECT。

INSERT INTO bpm_staging ( 
    id, pay_obj, merchant, address,
    city, country,debit_num, first_name,
    state, zip, id_type,bank_no)
  SELECT 
    p.account_obj, p.id, p.ach, pc.address,
    pc.city, pc.country, pc.debit_num, pc.name,
    pc.state, pc.zip, p.id_type,pc.bank_no
  FROM au_pay_t p, au_pay_dd_t pc 
  WHERE p.id= pc.obj;

我使用上面的语句是因为,使用游标需要更长的时间。对于必须修改查询的任何人来说,使用 Select 也更容易理解。

但是,我的 DBA 拒绝在生产环境中运行,因为这需要很长时间才能逐行插入 540K 记录。

当我在网上搜索时,我发现 BULK_COLLECT /FORALL 就性能而言是更好的选择。

请提出更好的解决方法。如果 BULK_COLLECT 是一个不错的选择,那么请推荐一个很好的例子。

4

2 回答 2

1
  1. 定义适当的 PL/SQL 类型(记录类型和嵌套表类型)来收集结果:

    TYPE my_type IS RECORD (
        account_obj au_pay_t.account_obj%TYPE,
        id          au_pay_t.id%TYPE,
        /* ... */
        bank_no     au_pay_dd_t.bank_no%TYPE
    );
    
    TYPE my_tab_type IS TABLE OF my_type;
    
  2. 用上面定义的嵌套表类型声明一个 PL/SQL 变量:

    DECLARE
      my_tab my_tab_type;
    
  3. 使用您的变量来存储查询结果:

    SELECT
      p.account_obj, p.id, p.ach, pc.address,
      pc.city, pc.country, pc.debit_num, pc.name,
      pc.state, pc.zip, p.id_type,pc.bank_no
    BULK COLLECT INTO my_tab
    FROM au_pay_t p, au_pay_dd_t pc
    WHERE p.id = pc.obj;
    
  4. 最后,循环结果以将它们插入到您的表中

    FORALL i IN 1..my_tab.COUNT
      INSERT INTO bpm_staging ( 
          id, pay_obj, merchant, address,
          city, country,debit_num, first_name,
          state, zip, id_type,bank_no)
      VALUES (
          my_tab(i).account_obj, my_tab(i).id,
          ..., my_tab(i).bank_no);
    
    • 警告:上述构造仅适用于 Oracle 11g 或更高版本
于 2013-11-01T14:12:53.357 回答
0
insert /*+ append */ into

也可能加快速度。

于 2013-11-01T13:54:01.550 回答