【问题标题】:BULK COLLECT INSERT and after checking duplicatesBULK COLLECT INSERT 并检查重复项后
【发布时间】:2015-04-25 05:49:34
【问题描述】:

在 plsql 中,我想将大约 100 万行从临时表插入到实际表中,目前我正在为此使用游标 for 循环。 但是我知道有一种方法可以通过对所有命令使用批量插入来加快这一速度,但我在消除重复部分中苦苦挣扎。你能帮忙把下面的代码转换成批量收集吗

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, 
			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;

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    据我所知,您确实没有任何理由使用 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);
    

    您在实际代码中是否进行了比这更多的处理?

    【讨论】:

    • 谢谢兄弟...在我这边给定的示例代码中有一个输入错误..hps_ps_terr_sales_1415 --->sales_actual....所以它会产生相同的输出吗?
    猜你喜欢
    • 2015-02-21
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多