Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 避免在oracle表中多次插入_Sql_Oracle_Performance_Plsql_Sql Insert - Fatal编程技术网

Sql 避免在oracle表中多次插入

Sql 避免在oracle表中多次插入,sql,oracle,performance,plsql,sql-insert,Sql,Oracle,Performance,Plsql,Sql Insert,**加载100000行的更快方法。我有一个脚本,可以从多个oracle表中获取数据,而不是多个insert想要1个insert**。根据订单类型,临时表中有多个插入项。根据订单类型插入100000条或更多记录。基于订单类型的多次插入需要12-14分钟。有没有更快的办法 prompt Querying freight ... SET serveroutput ON SIZE 1000000 DECLARE

**加载100000行的更快方法。我有一个脚本,可以从多个oracle表中获取数据,而不是多个insert想要1个insert**。根据订单类型,临时表中有多个插入项。根据订单类型插入100000条或更多记录。基于订单类型的多次插入需要12-14分钟。有没有更快的办法

               prompt Querying freight ...
            SET serveroutput ON SIZE 1000000
            DECLARE

               CURSOR c_progpcon 
               IS
                  SELECT cust_id
                        ,div_no
                    FROM dss.program_processing_controls;

               CURSOR c_custord(in_orgrole_id_customer IN dss.orders.orgrole_id_customer%TYPE)
               IS
                  SELECT id order_id
                        ,order_type
                        ,order_number
                        ,customer_po
                    FROM dss.orders
                    WHERE order_type = 'CUST'
                      AND orgrole_id_customer = in_orgrole_id_customer;

               CURSOR c_outbound(in_order_id IN dss.orders.id%TYPE)
               IS
                  SELECT ship.id ship_id
                        ,ship.shipper_no
                        ,shptrk.id shptrk_id
                        ,shptrk.waybill
                        ,shptrk.estimated_freight
                        ,shptrk.actual_freight
                        ,shptrk.dt_created
                    FROM dss.shipments ship
                        ,dss.shipment_trackings shptrk
                    WHERE ship.order_id = in_order_id
                      AND shptrk.ship_id = ship.id
                     -- and ship.id = 2290451
                      AND shptrk.dt_created BETWEEN TO_DATE('01-JAN-2017','dd-MON-yyyy') 
                                                   AND TO_DATE('31-DEC-2017','dd-MON-yyyy');

               CURSOR c_ordsch(in_order_id IN dss.orders.id%TYPE)
               IS
                  SELECT ordsch.id ordsch_id
                    FROM dss.orders ord
                        ,dss.ordered_items orditm
                        ,dss.ordered_item_schedules ordsch
                    WHERE ord.id = in_order_id
                      AND orditm.order_id = ord.id
                      AND ordsch.orditm_id = orditm.id;

               CURSOR c_inbound(in_orditm_id IN dss.ordered_items.id%TYPE)
               IS
                  SELECT recshp.id recshp_id
                        ,recshp.waybill
                        ,recshp.estimated_freight
                        ,recshp.actual_freight
                        ,recshp.dt_created
                    FROM dss.built_items bltitm
                        ,dss.received_shipments recshp
                    WHERE bltitm.orditm_id_rcvd = in_orditm_id
                      AND recshp.id = bltitm.recshp_id
                      AND recshp.dt_created BETWEEN TO_DATE('01-JAN-2017','dd-MON-yyyy') 
                                                    AND TO_DATE('31-DEC-2017','dd-MON-yyyy')
                  UNION ALL
                  SELECT recshp.id recshp_id
                        ,recshp.waybill
                        ,recshp.estimated_freight
                        ,recshp.actual_freight
                        ,recshp.dt_created
                    FROM dss.received_items rcvitm
                        ,dss.received_shipments recshp
                    WHERE rcvitm.orditm_id_rcvd = in_orditm_id
                      AND recshp.id = rcvitm.recshp_id
                      AND recshp.dt_created BETWEEN TO_DATE('01-JAN-2017','dd-MON-yyyy') 
                                                    AND TO_DATE('31-DEC-2017','dd-MON-yyyy');

               v_cust_processed NUMBER := 0;
               v_custord_processed NUMBER := 0;
               v_orgrole_id_customer dss.org_roles.id%TYPE;

               v_estimated_freight_custord adwaram.order_freight.estimated_freight%TYPE;
               v_actual_freight_custord adwaram.order_freight.actual_freight%TYPE;

               v_orditm_id_core dss.exchange_cores.orditm_id%TYPE;
               v_order_id_core dss.orders.id%TYPE;
               v_bltitm_id_core dss.po_histories.bltitm_id%TYPE;

               v_order_type dss.orders.order_type%TYPE;
               v_order_number dss.orders.order_number%TYPE;

               v_order_id_xfer dss.orders.id%TYPE;
               v_order_id_inbound dss.orders.id%TYPE;
               v_orditm_id_po ordered_items.id%TYPE;

               --anu
               v_calc_freight number:=0;
               v_method varchar2(4000);

            BEGIN

               FOR c_progpcon_rec IN c_progpcon
               LOOP

                  v_cust_processed := v_cust_processed + 1;
                  SELECT orgrole_id
                    INTO v_orgrole_id_customer
                    FROM dss.customers
                   WHERE id = c_progpcon_rec.cust_id;

                  FOR c_custord_rec IN c_custord(v_orgrole_id_customer)
                  LOOP

                     v_custord_processed := v_custord_processed + 1;

                     -- outbound customer order
                     FOR c_outbound_rec IN c_outbound(c_custord_rec.order_id)
                     LOOP
                        begin
                          v_calc_freight:=DSS.PKG_ESTIMATED_FREIGHT.GET_ESTIMATED_FREIGHT
                                         (null,c_outbound_rec.ship_id,v_method);
                           exception
                            when others then
                            v_calc_freight := 0;

                        end;
                        INSERT INTO adwaram.order_freight
                           (order_type
                           ,order_number
                           ,shipper_no
                           ,waybill
                           ,actual_freight
                           ,estimated_freight
                           ,waybill_entered
                           ,order_id
                           ,ship_id
                           ,shptrk_id
                           ,recshp_id
                           ,cust_id
                           ,order_id_cust
                           ,notes
                           ,dt_created)
                           VALUES
                           (c_custord_rec.order_type
                           ,c_custord_rec.order_number
                           ,c_outbound_rec.shipper_no
                           ,c_outbound_rec.waybill
                           ,c_outbound_rec.actual_freight
                           ,v_calc_freight--c_outbound_rec.estimated_freight
                           ,c_outbound_rec.dt_created
                           ,c_custord_rec.order_id
                           ,c_outbound_rec.ship_id
                           ,c_outbound_rec.shptrk_id
                           ,NULL
                           ,c_progpcon_rec.cust_id
                           ,c_custord_rec.order_id
                           ,'OUTBOUND CUST ORDER'
                           ,SYSDATE);

                     END LOOP;

                     FOR c_ordsch_rec IN c_ordsch(c_custord_rec.order_id)
                     LOOP

                        -- get core
                        BEGIN

                           SELECT xccore.orditm_id
                                 ,pohist.bltitm_id
                             INTO v_orditm_id_po
                                 ,v_bltitm_id_core
                             FROM dss.exchange_units xcunit
                                 ,dss.exchange_cores xccore
                                 ,dss.po_histories pohist
                            WHERE xcunit.ordsch_id = c_ordsch_rec.ordsch_id
                              AND xccore.xcitm_id = xcunit.xcitm_id
                              AND pohist.orditm_id(+) = xccore.orditm_id;

                           IF v_bltitm_id_core IS NOT NULL
                           THEN
                              v_order_id_core := dss.pkg_inven.func_get_order(v_bltitm_id_core
                                                                             ,'ORDER_ID');
                              v_orditm_id_core := dss.pkg_inven.func_get_order(v_bltitm_id_core
                                                                              ,'ORDITM_ID');
                           ELSE
                              v_order_id_core := NULL;
                           END IF;

                           IF v_order_id_core IS NOT NULL
                           THEN

                              -- outbound order for received core (repair order or customer order)
                              FOR c_outbound_rec IN c_outbound(v_order_id_core)
                              LOOP
                                     begin
                                        v_calc_freight:=DSS.PKG_ESTIMATED_FREIGHT.GET_ESTIMATED_FREIGHT
                                         (null,c_outbound_rec.ship_id,v_method);
                                      exception
                                       when others then
                                      v_calc_freight := 0;

                                     end;
                                 SELECT order_type
                                       ,order_number
                                   INTO v_order_type
                                       ,v_order_number
                                   FROM dss.orders
                                  WHERE id = v_order_id_core;

                                 INSERT INTO adwaram.order_freight
                                    (order_type
                                    ,order_number
                                    ,shipper_no
                                    ,waybill
                                    ,actual_freight
                                    ,estimated_freight
                                    ,waybill_entered
                                    ,order_id
                                    ,ship_id
                                    ,shptrk_id
                                    ,recshp_id
                                    ,cust_id
                                    ,order_id_cust
                                    ,notes
                                    ,dt_created)
                                    VALUES
                                    (v_order_type
                                    ,v_order_number
                                    ,c_outbound_rec.shipper_no
                                    ,c_outbound_rec.waybill
                                    ,c_outbound_rec.actual_freight
                                    ,v_calc_freight--c_outbound_rec.estimated_freight
                                    ,c_outbound_rec.dt_created
                                    ,v_order_id_core
                                    ,c_outbound_rec.ship_id
                                    ,c_outbound_rec.shptrk_id
                                    ,NULL
                                    ,c_progpcon_rec.cust_id
                                    ,c_custord_rec.order_id
                                    ,'OUTBOUND '||v_order_type||' ORDER'
                                    ,SYSDATE);

                              END LOOP;

                           END IF;

                           -- xfer related to customer order
                           BEGIN

                              SELECT ord.id
                                INTO v_order_id_xfer
                                FROM dss.orders ord
                                    ,dss.ordered_items orditm
                               WHERE ord.order_type = 'XFER'
                                 AND ord.div_no = c_progpcon_rec.div_no
                                 AND orditm.order_id = ord.id
                                 AND orditm.customer_po = c_custord_rec.customer_po;

                              FOR c_outbound_rec IN c_outbound(v_order_id_xfer)
                              LOOP
                                 begin
                                   v_calc_freight:=DSS.PKG_ESTIMATED_FREIGHT.GET_ESTIMATED_FREIGHT
                                             ( null,c_outbound_rec.ship_id,v_method);

                                     exception
                                      when others then
                                        v_calc_freight := 0;

                                 end;

                                 SELECT order_type
                                       ,order_number
                                   INTO v_order_type
                                       ,v_order_number
                                   FROM dss.orders
                                  WHERE id = v_order_id_xfer;

                                 INSERT INTO adwaram.order_freight
                                    (order_type
                                    ,order_number
                                    ,shipper_no
                                    ,waybill
                                    ,actual_freight
                                    ,estimated_freight
                                    ,waybill_entered
                                    ,order_id
                                    ,ship_id
                                    ,shptrk_id
                                    ,recshp_id
                                    ,cust_id
                                    ,order_id_cust
                                    ,notes
                                    ,dt_created)
                                    VALUES
                                    (v_order_type
                                    ,v_order_number
                                    ,c_outbound_rec.shipper_no
                                    ,c_outbound_rec.waybill
                                    ,c_outbound_rec.actual_freight
                                    ,v_calc_freight--c_outbound_rec.estimated_freight
                                    ,c_outbound_rec.dt_created
                                    ,v_order_id_xfer
                                    ,c_outbound_rec.ship_id
                                    ,c_outbound_rec.shptrk_id
                                    ,NULL
                                    ,c_progpcon_rec.cust_id
                                    ,c_custord_rec.order_id
                                    ,'OUTBOUND '||v_order_type||' ORDER'
                                    ,SYSDATE);

                              END LOOP;

                           EXCEPTION
                              WHEN NO_DATA_FOUND
                                   OR TOO_MANY_ROWS
                              THEN
                                 NULL;
                           END;


                           -- inbound orders associate with exchange - v_orditm_id_core (if ro)
                           --                                          v_orditm_id_po (csp po)
                           IF v_orditm_id_core IS NOT NULL
                           THEN

                              FOR c_inbound_rec IN c_inbound(v_orditm_id_core)
                              LOOP
                                    begin
                                       v_calc_freight:=DSS.PKG_ESTIMATED_FREIGHT.GET_ESTIMATED_FREIGHT
                                             ( c_inbound_rec.recshp_id,null,v_method);

                                        exception
                                          when others then
                                            v_calc_freight := 0;

                                    end;
                                 SELECT ord.order_type
                                       ,ord.order_number
                                       ,ord.id
                                   INTO v_order_type
                                       ,v_order_number
                                       ,v_order_id_inbound
                                   FROM dss.ordered_items orditm
                                       ,dss.orders ord
                                  WHERE orditm.id = v_orditm_id_core
                                    AND ord.id = orditm.order_id;

                                 INSERT INTO adwaram.order_freight
                                    (order_type
                                    ,order_number
                                    ,shipper_no
                                    ,waybill
                                    ,actual_freight
                                    ,estimated_freight
                                    ,waybill_entered
                                    ,order_id
                                    ,ship_id
                                    ,shptrk_id
                                    ,recshp_id
                                    ,cust_id
                                    ,order_id_cust
                                    ,notes
                                    ,dt_created)
                                    VALUES
                                    (v_order_type
                                    ,v_order_number
                                    ,NULL
                                    ,c_inbound_rec.waybill
                                    ,c_inbound_rec.actual_freight
                                    ,v_calc_freight--c_inbound_rec.estimated_freight
                                    ,c_inbound_rec.dt_created
                                    ,v_order_id_inbound
                                    ,NULL
                                    ,NULL
                                    ,c_inbound_rec.recshp_id
                                    ,c_progpcon_rec.cust_id
                                    ,c_custord_rec.order_id
                                    ,'INBOUND '||v_order_type||' ORDER'
                                    ,SYSDATE);

                              END LOOP;

                           END IF;

                           IF v_orditm_id_po IS NOT NULL
                           THEN

                              FOR c_inbound_rec IN c_inbound(v_orditm_id_po)
                              LOOP
                              begin
                              v_calc_freight:=DSS.PKG_ESTIMATED_FREIGHT.GET_ESTIMATED_FREIGHT
                                         ( c_inbound_rec.recshp_id
                                         ,NULL
                                         , v_method
                                         );
               exception
                         when others then
                         v_calc_freight := 0;

                        end;

                                 SELECT ord.order_type
                                       ,ord.order_number
                                       ,ord.id
                                   INTO v_order_type
                                       ,v_order_number
                                       ,v_order_id_inbound
                                   FROM dss.ordered_items orditm
                                       ,dss.orders ord
                                  WHERE orditm.id = v_orditm_id_po
                                    AND ord.id = orditm.order_id;

                                 INSERT INTO adwaram.order_freight
                                    (order_type
                                    ,order_number
                                    ,shipper_no
                                    ,waybill
                                    ,actual_freight
                                    ,estimated_freight
                                    ,waybill_entered
                                    ,order_id
                                    ,ship_id
                                    ,shptrk_id
                                    ,recshp_id
                                    ,cust_id
                                    ,order_id_cust
                                    ,notes
                                    ,dt_created)
                                    VALUES
                                    (v_order_type
                                    ,v_order_number
                                    ,NULL
                                    ,c_inbound_rec.waybill
                                    ,c_inbound_rec.actual_freight
                                    ,v_calc_freight--c_inbound_rec.estimated_freight
                                    ,c_inbound_rec.dt_created
                                    ,v_order_id_inbound
                                    ,NULL
                                    ,NULL
                                    ,c_inbound_rec.recshp_id
                                    ,c_progpcon_rec.cust_id
                                    ,c_custord_rec.order_id
                                    ,'INBOUND '||v_order_type||' ORDER'
                                    ,SYSDATE);

                              END LOOP;

                           END IF;

                        EXCEPTION
                           WHEN NO_DATA_FOUND
                                OR TOO_MANY_ROWS 
                           THEN
                              NULL;
                        END;

                     END LOOP;

                  END LOOP;

               END LOOP;

               COMMIT;
               dbms_output.put_line(TO_CHAR(v_cust_processed)||' customers processed.');
               dbms_output.put_line(TO_CHAR(v_custord_processed)||' customer orders processed.');

            END;
            /
  • 检查所有查询的执行计划,确保它们正常工作 果然
  • 如中所述,使用批量收集和FORALL进行批量处理 史蒂文·费尔斯坦的这篇文章可能会有所帮助

  • 是的,有快得多的方法…游标很慢,请另找一种方法。不幸的是,我没有时间去看那个庞大的脚本,你能给我举个例子吗?几天前你问了这个问题(但看起来你把它删除了)。显然你当时没有得到满意的答案,现在也不会得到。这是一个无法回答的问题。你不能合理地期望陌生人在没有任何商业规则解释的情况下浏览几百行格式糟糕、粗制滥造的代码。我们不是来帮你完成工作的。在你的代码中,你总是逐行处理数据,这基本上是最慢的处理方式。将插入转换为
    插入到。。。选择。。。从…
    。如果这是不可能的(虽然从您的代码快速查看它应该没有问题)考虑<代码>批量收集到< /代码>和<代码> FALL/<代码>操作。跳过
    v_cust_processed
    v_custor_processed
    处理/输出,您不需要它们。已尝试使用批量收集。获取错误,对于1中的i1。。c_outbound_tab.count循环开始--对1中的所有i1进行大容量插入。。c_outbound_tab.count PLS-00436:实现限制:无法引用记录绑定表中的批量字段无法发布所有代码。--填充pl/sql表打开c_outbound(c_客户记录订单id);将c_outbound BULK COLLECT提取到c_outbound_选项卡中;关闭c_出站;