最近要上線囉,再轉30000 多筆item 時,

問題一.發生一次全丟進去轉入會死給你看的情形

oracle 啊oracle ...嘆氣ing ,

解法: 因此必須要拆筆數分批轉入,所以改寫500筆submit 一個request ,

問題二.

同一個session 不能FND_GLOBAL.APPS_INITIALIZE 兩次,送出第一個request後,再送就錯誤...oracle 啊oracle ...嘆氣ing ,

解法:建立function 做自治性事務騙過oracle .紅字是重點,請自己找google了解他是做蛇用的.

CREATE OR REPLACE FUNCTION APPS.import_INCOIN(vmas_org in number,vprocess_id in number)   RETURN NUMBER
as
p_request_id       NUMBER;
l_phase            VARCHAR2 (255);
l_status           VARCHAR2 (255);
l_dev_phase        VARCHAR2 (255);
l_dev_status       VARCHAR2 (255);
l_message          VARCHAR2 (255);
l_request_status   BOOLEAN := FALSE;
l_return           NUMBER;
pragma autonomous_transaction;
BEGIN
   FND_GLOBAL.APPS_INITIALIZE (user_id        => 1157,
                                    resp_id        => 50659,
                                    resp_appl_id   => 401);
   p_request_id :=
      fnd_request.submit_request ('INV',
                                       'INCOIN',
                                       'Import item',
                                       NULL,
                                       FALSE,
                                       vmas_org,
                                       '1',
                                       '1',
                                       '1',
                                       '1',
                                       vprocess_id,
                                       '1');
        sys.dbms_output.put_line(to_char(p_request_id));
        commit;
            /*                           
   l_request_status :=
      Fnd_Concurrent.Wait_For_Request (p_request_id,
                                            5,
                                            0,
                                            l_phase,
                                            l_status,
                                            l_dev_phase,
                                            l_dev_status,
                                            l_message);

   IF l_request_status
   THEN
      IF l_dev_status = 'NORMAL'
      THEN
         --  DBMS_OUTPUT.put_line ('運行成功:' || l_dev_status || ',開始指定分類/海關料號/客料號....' );
         --開始塞 customer item interface
         --開始塞 item category interface
         --呼叫cross reference api 新增海關分類,編碼
         --.submit_request 呼叫以上幾個需要執行import 的program .
         l_return := 1;
      ELSE
         --  DBMS_OUTPUT.put_line ('運行請求不成功:' || l_dev_status);
         l_return := 0;
      --  RETURN;
      END IF;
   ELSE
      -- DBMS_OUTPUT.put_line ('請求未完成,無法察看!');
      l_return := 2;
   -- RETURN;
   END IF;
  */
   return l_return;
END;
/

 

問題三.

 搞定一次送出多個conc request 後,發現job一直running 跑不完,trace 後發現這程式,不能平行執行....程式也沒限制也沒說明  

oracle 啊oracle ...嘆氣ing

解法:將該程式設定成跟自己互斥,請參考如下圖

未命名.jpg   

 

 

最後, 終於可以了....oracle 啊oracle ...oracle 啊oracle ...oracle 啊oracle ...嘆氣ing

未命名.jpg  

主執行程式如下

DECLARE
   /** create master org item */
   CURSOR cur
   IS
      SELECT   *
        FROM   R12_IMPORT_ITEM_201106; /*這是我整理好要轉進去的item */
     --  WHERE   ROWNUM <= 5000;

   rec_imp             MTL_SYSTEM_ITEMS_INTERFACE%ROWTYPE;
   rec_imp_init        MTL_SYSTEM_ITEMS_INTERFACE%ROWTYPE;
   vPROCESS_FLAG       NUMBER := 1;
   vTRANSACTION_TYPE   VARCHAR2 (10) := NULL;
   vSET_PROCESS_ID     NUMBER := 1694;
   vmas_org            NUMBER := 103;
   vCREATED_BY         NUMBER := 1157;
   i                   PLS_INTEGER := 0;
   cnt number:=30000; /*這是我要產生分批轉入的批次pprocess no 累加*/
BEGIN
   FOR rec IN cur
   LOOP
      rec_imp := rec_imp_init;
      rec_imp.ORGANIZATION_ID := rec.ORGANIZATION_ID;
      rec_imp.CREATED_BY := vCREATED_BY;
      rec_imp.SET_PROCESS_ID :=  cnt ;
      rec_imp.PROCESS_FLAG := vPROCESS_FLAG;
      rec_imp.TRANSACTION_TYPE := NULL;

      BEGIN
         SELECT   'UPDATE'

           INTO   rec_imp.TRANSACTION_TYPE

           FROM  MTL_SYSTEM_ITEMS
          WHERE   ORGANIZATION_ID = vmas_org AND segment1 = rec.segment1;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            rec_imp.TRANSACTION_TYPE := 'CREATE';
      END;

      BEGIN
         rec_imp.ORGANIZATION_ID := vmas_org;           --rec.ORGANIZATION_ID;
         rec_imp.SEGMENT1 := rec.SEGMENT1;

         IF LENGTHB (rec.DESCRIPTION) > 200
         THEN
            rec_imp.DESCRIPTION := ' 料號說明太長>240,需調整!';
            sys.DBMS_OUTPUT.put_line (rec.SEGMENT1);
         ELSE
            rec_imp.DESCRIPTION := rec.DESCRIPTION;
         END IF;

         rec_imp.ITEM_TYPE := rec.R12_ITEM_TYPE;
         rec_imp.TEMPLATE_ID := rec.TEMPLATE_ID;
         rec_imp.INVENTORY_ITEM_STATUS_CODE := rec.INVENTORY_ITEM_STATUS_CODE;
         rec_imp.RETURNABLE_FLAG := rec.RETURNABLE_FLAG;
         rec_imp.RETURN_INSPECTION_REQUIREMENT :=
            rec.RETURN_INSPECTION_REQUIREMENT;
         /* 要assign category轉入用的,本例用不到
         rec_imp.INV_CATEGORY_ID := rec.INV_CATEGORY_ID;
         rec_imp.INV_CATEGORY := rec.INV_CATEGORY;
         rec_imp.SALES_CATEGORY_ID := rec.SALES_CATEGORY_ID;
         rec_imp.SALES_CATEGORY := rec.SALES_CATEGORY;
         rec_imp.COST_CATEGORY_ID := rec.COST_CATEGORY_ID;
         rec_imp.COST_CATEGORY := rec.COST_CATEGORY;
         rec_imp.PO_CATEGORY_ID := rec.PO_CATEGORY_ID;
         rec_imp.PO_CATEGORY := rec.PO_CATEGORY;
         rec_imp.MFG_CATEGORY_ID := rec.MFG_CATEGORY_ID;
         rec_imp.MFG_CATEGORY := rec.MFG_CATEGORY;
         */
         rec_imp.PLANNING_MAKE_BUY_CODE := rec.PLANNING_MAKE_BUY_CODE;
         rec_imp.PREPROCESSING_LEAD_TIME := rec.PREPROCESSING_LEAD_TIME;
         rec_imp.FULL_LEAD_TIME := rec.FULL_LEAD_TIME;
         /*make 件不能有 post leadtime,要轉掉*/
         IF rec_imp.PLANNING_MAKE_BUY_CODE = 1
            AND NVL (rec.POSTPROCESSING_LEAD_TIME, 0) <> 0
         THEN
            rec_imp.FIXED_LEAD_TIME :=
               NVL (rec.FIXED_LEAD_TIME, 0)
               + NVL (rec.POSTPROCESSING_LEAD_TIME, 0);
            rec_imp.POSTPROCESSING_LEAD_TIME := 0;
         ELSE
            rec_imp.FIXED_LEAD_TIME := rec.FIXED_LEAD_TIME;
            rec_imp.POSTPROCESSING_LEAD_TIME := rec.POSTPROCESSING_LEAD_TIME;
         END IF;


         rec_imp.VARIABLE_LEAD_TIME := rec.VARIABLE_LEAD_TIME;
         rec_imp.CUM_MANUFACTURING_LEAD_TIME :=
            rec.CUM_MANUFACTURING_LEAD_TIME;
         rec_imp.CUMULATIVE_TOTAL_LEAD_TIME := rec.CUMULATIVE_TOTAL_LEAD_TIME;
         rec_imp.WIP_SUPPLY_TYPE := rec.WIP_SUPPLY_TYPE;
         --rec_imp.WIP_SUPPLY_SUBINVENTORY := rec.WIP_SUPPLY_SUBINVENTORY;
         --rec_imp.WIP_SUPPLY_LOCATOR_ID := rec.WIP_SUPPLY_LOCATOR_ID;
         --rec_imp.DEFAULT_RECEIVING_SUBINV := rec.DEFAULT_RECEIVING_SUBINV;
         rec_imp.PRIMARY_UNIT_OF_MEASURE := rec.PRIMARY_UNIT_OF_MEASURE;
         --rec_imp.COST_OF_SALES_ACCOUNT := rec.COST_OF_SALES_ACCOUNT;
         --rec_imp.EXPENSE_ACCOUNT := rec.EXPENSE_ACCOUNT;
         --rec_imp.SALES_ACCOUNT := rec.SALES_ACCOUNT;
         rec_imp.PLANNER_CODE := rec.PLANNER_CODE;
         rec_imp.SAFETY_STOCK_BUCKET_DAYS := rec.SAFETY_STOCK_BUCKET_DAYS;
         rec_imp.MRP_SAFETY_STOCK_PERCENT := rec.MRP_SAFETY_STOCK_PERCENT;
         rec_imp.MRP_SAFETY_STOCK_CODE := rec.MRP_SAFETY_STOCK_CODE;
         rec_imp.FIXED_DAYS_SUPPLY := rec.FIXED_DAYS_SUPPLY;
         rec_imp.MINIMUM_ORDER_QUANTITY := rec.MINIMUM_ORDER_QUANTITY;
         rec_imp.MAXIMUM_ORDER_QUANTITY := rec.MAXIMUM_ORDER_QUANTITY;
         rec_imp.FIXED_LOT_MULTIPLIER := rec.FIXED_LOT_MULTIPLIER;
         rec_imp.MIN_MINMAX_QUANTITY := rec.MIN_MINMAX_QUANTITY;
         rec_imp.MAX_MINMAX_QUANTITY := rec.MAX_MINMAX_QUANTITY;
         rec_imp.DAYS_EARLY_RECEIPT_ALLOWED := rec.DAYS_EARLY_RECEIPT_ALLOWED;
         rec_imp.DAYS_LATE_RECEIPT_ALLOWED := rec.DAYS_LATE_RECEIPT_ALLOWED;
         rec_imp.RECEIPT_DAYS_EXCEPTION_CODE :=
            rec.RECEIPT_DAYS_EXCEPTION_CODE;
         rec_imp.RESTRICT_SUBINVENTORIES_CODE :=
            rec.RESTRICT_SUBINVENTORIES_CODE;
      END;
       /*本例只塞new item , update 不再此例介紹 */
      IF rec_imp.TRANSACTION_TYPE = 'CREATE'
      THEN
         i := i + 1;
       
         INSERT INTO MTL_SYSTEM_ITEMS_INTERFACE
           VALUES   rec_imp;

         COMMIT;
        
         IF i >= 500
         THEN
           declare
             sts number;
           /*每500 record 送出request一次*/
           begin            
            sts:=APPS.import_INCOIN(vmas_org, cnt);
             cnt := cnt+1;
          end;
            i := 0;
         END IF;
      END IF;
   END LOOP;

   COMMIT;
END;


arrow
arrow
    全站熱搜

    Nolem 發表在 痞客邦 留言(1) 人氣()