2015-04-24 12 views
0

В plsql я хочу вставить около 1 миллиона строк из промежуточной таблицы в фактическую таблицу, и в настоящее время я использую для этого курсор для цикла. Но я понимаю, что есть способ ускорить это с помощью массовой вставки для всей команды, но я боюсь в разделе устранения дубликатов. Может у пожалуйста, помогите, чтобы преобразовать код, приведенный ниже, чтобы использовать насыпной собиратьBULK COLLECT INSERT и после проверки дубликатов

DECLARE 
 
CURSOR c1 is 
 
    select 
 
     ps_item_code, 
 
     item_code, 
 
     cons_date, 
 
     shop_code, 
 
     dept_code, 
 
     class_code, 
 
     sub_class_code, 
 
     supl_code, 
 
     plu_price, 
 
     sal_qty, 
 
     sal_val_in_lc, 
 
     disc_val_in_lc, 
 
     tax_val_in_lc, 
 
     odept, oclass, osubclass 
 
    from 
 
     sales_stage; 
 
BEGIN 
 
    FOR i in c1 loop 
 
     BEGIN 
 
      my_cnt := 0; 
 
      select count(1) into my_cnt from hps_ps_terr_sales_1415 
 
      where item_code=i.item_code and cons_date=i.cons_date and shop_code=i.shop_code and sal_qty=i.sal_qty and supl_code=i.supl_code; 
 
      IF my_cnt = 0 THEN 
 
       BEGIN 
 
        insert into sales_actual 
 
         ( 
 
         ps_item_code, 
 
         item_code, 
 
         cons_date, 
 
         shop_code, 
 
         dept_code, 
 
         class_code, 
 
         sub_class_code, 
 
         supl_code, 
 
         plu_price, 
 
         sal_qty, 
 
         sal_val_in_lc, 
 
         disc_val_in_lc, 
 
         tax_val_in_lc, odept, oclass, osubclass, 
 
\t \t \t dept, class, subclass 
 
         ) 
 
        values 
 
         (
 
         i.terr_code, 
 
         i.ps_item_code, 
 
         i.item_code, 
 
         i.cons_date, 
 
         i.shop_code, 
 
         i.dept_code, 
 
         i.class_code, 
 
         i.sub_class_code, 
 
         i.supl_code, 
 
         i.plu_price, 
 
         i.sal_qty, 
 
         i.sal_val_in_lc, 
 
         i.disc_val_in_lc, 
 
         i.tax_val_in_lc, i.odept, i.oclass, i.osubclass, 
 
         i.dept_code, 
 
         i.class_code, 
 
         i.sub_class_code 
 
         );        
 
       END; 
 
      END IF; 
 
     END; 
 
    END LOOP; 
 
    COMMIT; 
 
END;

ответ

4

Насколько я могу судить, вы действительно не имеют никаких оснований использовать PL/SQL. Следующее должно выполнить тот же конечный результат, что и ваш текущий код.

INSERT INTO sales_actual 
    (ps_item_code 
    ,item_code 
    ,cons_date 
    ,shop_code 
    ,dept_code 
    ,class_code 
    ,sub_class_code 
    ,supl_code 
    ,plu_price 
    ,sal_qty 
    ,sal_val_in_lc 
    ,disc_val_in_lc 
    ,tax_val_in_lc 
    ,odept 
    ,oclass 
    ,osubclass 
    ,dept 
    ,class 
    ,subclass) 
    SELECT i.terr_code 
     ,i.ps_item_code 
     ,i.item_code 
     ,i.cons_date 
     ,i.shop_code 
     ,i.dept_code 
     ,i.class_code 
     ,i.sub_class_code 
     ,i.supl_code 
     ,i.plu_price 
     ,i.sal_qty 
     ,i.sal_val_in_lc 
     ,i.disc_val_in_lc 
     ,i.tax_val_in_lc 
     ,i.odept 
     ,i.oclass 
     ,i.osubclass 
     ,i.dept_code 
     ,i.class_code 
     ,i.sub_class_code 
    FROM sales_stage i 
    WHERE NOT EXISTS 
      (SELECT NULL 
      FROM hps_ps_terr_sales_1415 t 
      WHERE t.item_code = i.item_code 
       AND t.cons_date = i.cons_date 
       AND t.shop_code = i.shop_code 
       AND t.sal_qty = i.sal_qty 
       AND t.supl_code = i.supl_code); 

Вы делаете больше обработки, чем это в фактическом коде?

+0

спасибо брату ... была ошибка ввода в данном примере кода с моей стороны..hps_ps_terr_sales_1415 ---> sales_actual .... так же, как это произведет это? –