PLSQL Developer/Console執行不同

--當數據量很大時,如果PLSQL Developer中執行下面語句是可以全部導出DBMS_OUTPUT.PUT_LINE結果的,

--但如果用控制檯登陸sqlplus來執行下面語句會由於緩衝大小不夠導致DBMS_OUTPUT.PUT_LINE結果只導出一部分

--一種辦法是分批導(rownum<501), 還有一種就是用程序實現(使執行程序的結果,即第一次sql,通過流輸出到一個.sql文件

--然後再執行此.sql文件)

SET SERVEROUTPUT ON;
DECLARE
CURSOR paymentbillCursor IS SELECT * FROM ems_inspect_payment WHERE PAYMENT_STATUS = 'O' AND CREATE_TYPE IS NOT NULL AND INSPECT_TYPE IS NOT NULL and rownum<501;
v_paymentbill EMS_INSPECT_PAYMENT%ROWTYPE;
v_paymentbill_rowCount NUMBER;
v_custom_broker_code VARCHAR2(200);
v_gb_count NUMBER;
v_bz_count NUMBER;
v_flag VARCHAR2(10);
v_payment_no VARCHAR2(14);
v_pb_cntr_status VARCHAR2(2);
v_is_cargo_inside NUMBER;
BEGIN
   DBMS_OUTPUT.ENABLE(1000000);
   DBMS_OUTPUT.PUT_LINE('SET SERVEROUTPUT ON;');
   DBMS_OUTPUT.PUT_LINE('DECLARE');
   DBMS_OUTPUT.PUT_LINE('v_paymentbill_pk NUMBER;');
   DBMS_OUTPUT.PUT_LINE('BEGIN');
   DBMS_OUTPUT.PUT_LINE('DBMS_OUTPUT.PUT_LINE(''start import PAYMENT_BILL data...'');');

   DBMS_OUTPUT.PUT_LINE(
   '   BEGIN
     SELECT ID_VALUE INTO v_paymentbill_pk FROM ID_GENERATOR WHERE ID_KEY=''MEMS_PAYMENT_BILL_ID'';
     EXCEPTION'
   );
   DBMS_OUTPUT.PUT_LINE(
   '     WHEN NO_DATA_FOUND THEN
       v_paymentbill_pk := 1;
       INSERT INTO ID_GENERATOR(ID_KEY, ID_VALUE) VALUES(''MEMS_PAYMENT_BILL_ID'', v_paymentbill_pk);
     COMMIT;
   END;'
   );
  
  v_paymentbill_rowCount :=0;
  
   OPEN paymentbillCursor;
   LOOP
      FETCH paymentbillCursor INTO v_paymentbill;
      EXIT WHEN paymentbillCursor%NOTFOUND;
     
      SELECT translate(v_paymentbill.PAYMENT_NO,'AC0123456789','ac') INTO v_flag FROM dual;
      v_payment_no:=NULL;
      IF v_flag IS NULL THEN
         v_payment_no:='B'||v_paymentbill.PAYMENT_NO;
      ELSE
         v_payment_no:= v_paymentbill.PAYMENT_NO;
      END IF;
     
      SELECT MIN(b.CUSTOM_CODE) INTO v_custom_broker_code FROM EMS_CUSTOMS_BROKER b
          WHERE b.CUSTOMS_BROKER = v_paymentbill.CUSTOMS_BROKER;
     
      SELECT COUNT(*) INTO v_gb_count FROM EMS_OPS_PAYMENT WHERE ops_type ='GB' AND PAYMENT_NO = v_paymentbill.PAYMENT_NO;
      SELECT COUNT(*) INTO v_bz_count FROM EMS_OPS_PAYMENT WHERE ops_type ='BZ' AND PAYMENT_NO = v_paymentbill.PAYMENT_NO;
     
      v_is_cargo_inside := 0;
      IF v_paymentbill.Remark IS NOT NULL THEN
         SELECT DECODE(INSTR(v_paymentbill.Remark, '空櫃有貨'),0,0,1) INTO v_is_cargo_inside FROM DUAL;
      END IF;
     
      IF v_paymentbill.CNTR_STATUS IN('EM','IM','XM','RM','SM','OM','TM','YM') THEN
         IF v_is_cargo_inside = 1 THEN v_pb_cntr_status := 'IF';
         ELSIF v_is_cargo_inside = 0 THEN v_pb_cntr_status := 'EM';
         END IF;
      ELSIF v_paymentbill.CNTR_STATUS IN ('IF','RE','SH','TF','YF') THEN  v_pb_cntr_status := 'IF';
      ELSIF v_paymentbill.CNTR_STATUS IN ('XF','OF','XI') THEN v_pb_cntr_status := 'XF';
      ELSE v_pb_cntr_status := v_paymentbill.CNTR_STATUS;
      END IF;
     
      DBMS_OUTPUT.PUT_LINE(
      'INSERT INTO MEMS_PAYMENT_BILL(ID, CREATED_BY, LASTUPDATED_BY, PAYMENT_BILL_NO,'
      );
    DBMS_OUTPUT.PUT_LINE(
      '       CUSTOM_BROKER_NAME, CUSTOM_BROKER_CODE, ORIGNAL_BILL_SHIP_NO, CNTR_ID, CNTR_STATUS,'
      );
    DBMS_OUTPUT.PUT_LINE(
      '       NGEN_CNTR_STATUS, CNTR_OWNER, NGEN_CNTR_SIZE, ORIGNAL_PAY_AMOUNT, PAY_AMOUNT,'
      );
      DBMS_OUTPUT.PUT_LINE(
      '       PAY_CURRENCY, IS_CARGO_INSIDE, REMARK, VERSION, CNTR_SIZE, STATUS,'
      );
    DBMS_OUTPUT.PUT_LINE(
      '       BLLLING_TYPE, CHECK_BY_ORG, CHECK_MODE, PAYMENT_CATEGORY, PAY_MODE,'
      );
    DBMS_OUTPUT.PUT_LINE(
      '       CREATED_TIME, LASTUPDATED_TIME, CHECK_COMMENCE_TIME, CHECK_END_TIME)'
      );
    DBMS_OUTPUT.PUT_LINE(
      ' VALUES(v_paymentbill_pk, '''||
                 v_paymentbill.CREATE_BY_ACTOR ||''', '''||
                 v_paymentbill.UPDATE_BY_ACTOR ||''', '''||
                 v_payment_no ||''', '
      );
      DBMS_OUTPUT.PUT_LINE('       '''||
                 v_paymentbill.CUSTOMS_BROKER ||''', '''||
                 v_custom_broker_code ||''', '''||
                 v_paymentbill.BILL_SHIP_NO ||''', '''||
                 v_paymentbill.CNTR_ID ||''', '''||
                 v_pb_cntr_status ||''', '''||
                 v_paymentbill.CNTR_STATUS ||''', '''||
                 v_paymentbill.CNTR_OWNER ||''', '
      );
      DBMS_OUTPUT.PUT_LINE('       '''||
                 v_paymentbill.CNTR_SIZE ||''', '||
                 NVL(v_paymentbill.PAYMENT_ACCOUNT, 0) ||', '||
                 NVL(v_paymentbill.PAYMENT_ACCOUNT, 0) ||', ''RMB'', '||
                 v_is_cargo_inside ||', '||
                 CASE WHEN v_paymentbill.REMARK IS NULL THEN 'NULL' ELSE ''''|| v_paymentbill.REMARK ||'''' END ||
                 ', 0,'
      );
      DBMS_OUTPUT.PUT_LINE('       '''||
                 CASE WHEN substr(v_paymentbill.CNTR_SIZE, 1, 1) = '2' THEN '20'
                      WHEN substr(v_paymentbill.CNTR_SIZE, 1, 1) = '4' THEN '40'
                      ELSE '45' END ||''', '''||
                 CASE WHEN v_paymentbill.PAYMENT_STATUS = 'O' THEN 'O'
                      WHEN v_paymentbill.PAYMENT_STATUS = 'C' THEN 'I'
                      WHEN v_paymentbill.PAYMENT_STATUS = 'F' THEN 'P'
                      WHEN v_paymentbill.PAYMENT_STATUS = 'R' THEN 'I1'
                      WHEN v_paymentbill.PAYMENT_STATUS = 'L' THEN 'R1' END ||''', '''||
                 CASE WHEN v_paymentbill.CREATE_TYPE = 'ZD' THEN 'A'
                      WHEN v_paymentbill.CREATE_TYPE = 'BZ' THEN 'H'
                      WHEN v_paymentbill.CREATE_TYPE = 'SG' THEN 'M' END ||''', '''||
                 CASE WHEN v_paymentbill.INSPECT_UNIT= 'CCIS' THEN 'CUS' ELSE 'CIQ' END ||''', '''||
                 CASE WHEN v_paymentbill.INSPECT_TYPE = 'MN' THEN 'MN'
                      WHEN v_paymentbill.INSPECT_TYPE = 'MA' THEN 'MA'
                      WHEN v_paymentbill.INSPECT_TYPE = 'VM' THEN 'MC'
                      WHEN v_paymentbill.INSPECT_TYPE = 'MC' THEN 'MC'
                      WHEN v_paymentbill.INSPECT_TYPE = 'GB' THEN 'W'
                      WHEN v_paymentbill.INSPECT_TYPE = 'DG' THEN 'R'
                      WHEN v_paymentbill.INSPECT_TYPE = 'CK' THEN 'D'
                      WHEN v_paymentbill.INSPECT_TYPE = 'KC' THEN 'D'
                      WHEN v_paymentbill.INSPECT_TYPE = 'SF' THEN 'SF'  ELSE v_paymentbill.INSPECT_TYPE  END ||''', '''||
                 CASE WHEN v_paymentbill.CHARGE_PROPERTY = '001' THEN 'TC'
                      WHEN v_paymentbill.CHARGE_PROPERTY = '003' THEN 'TS'
                      WHEN v_paymentbill.CHARGE_PROPERTY = '002'
                           AND v_paymentbill.INSPECT_TYPE IN ('DG','KC')
                           THEN 'H'
                      WHEN v_paymentbill.CHARGE_PROPERTY = '002'
                           AND v_paymentbill.INSPECT_TYPE IN ('GB')
                           AND v_gb_count > 0
                           THEN 'TW'
                      WHEN v_paymentbill.CHARGE_PROPERTY = '002'
                           AND v_paymentbill.INSPECT_TYPE IN ('GB')
                           AND v_gb_count = 0
                           AND v_bz_count > 0
                           THEN 'W' END ||''', '''||
                 CASE WHEN v_paymentbill.CHARGE_TYPE = 'CH' THEN 'C'
                      WHEN v_paymentbill.CHARGE_TYPE = 'MN' THEN 'M'
                      WHEN v_paymentbill.CHARGE_TYPE = 'MJ' THEN 'M'
                      WHEN v_paymentbill.CHARGE_TYPE = 'ON' THEN 'Z'
                      WHEN v_paymentbill.CHARGE_TYPE = 'OT' THEN 'O' END ||''', '
      );
      DBMS_OUTPUT.PUT_LINE('       '||
                 CASE WHEN v_paymentbill.CREATE_DATETIME IS NULL THEN 'NULL'
                 ELSE 'TO_DATE('''||TO_CHAR(v_paymentbill.CREATE_DATETIME,'yyyy-MM-dd hh24:mi:ss')||''',''yyyy-MM-dd hh24:mi:ss'')'
                 END ||','
      );
      DBMS_OUTPUT.PUT_LINE('       '||
                 CASE WHEN v_paymentbill.UPDATE_DATETIME IS NULL THEN 'NULL'
                 ELSE 'TO_DATE('''||TO_CHAR(v_paymentbill.UPDATE_DATETIME,'yyyy-MM-dd hh24:mi:ss')||''',''yyyy-MM-dd hh24:mi:ss'')'
                 END||','
      );
      DBMS_OUTPUT.PUT_LINE('       '||
                 CASE WHEN v_paymentbill.INSPECT_START_TIME IS NULL THEN 'NULL'
                 ELSE 'TO_DATE('''||TO_CHAR(v_paymentbill.INSPECT_START_TIME,'yyyy-MM-dd hh24:mi:ss')||''',''yyyy-MM-dd hh24:mi:ss'')'
                 END ||','
      );
      DBMS_OUTPUT.PUT_LINE('       '||
                 CASE WHEN v_paymentbill.INSPECT_END_TIME IS NULL THEN 'NULL'
                 ELSE 'TO_DATE('''||TO_CHAR(v_paymentbill.INSPECT_END_TIME,'yyyy-MM-dd hh24:mi:ss')||''',''yyyy-MM-dd hh24:mi:ss'')'
                 END ||');'
      );
                      
      --insert operation記錄
      DECLARE
      CURSOR paymentOpsCursor IS SELECT * FROM EMS_OPS_PAYMENT
             WHERE PAYMENT_NO = v_paymentbill.PAYMENT_NO AND v_paymentbill.INSPECT_TYPE IN ('GB', 'KC', 'DG', 'CK');
      v_paymentOps EMS_OPS_PAYMENT%ROWTYPE;
      v_WEIGHTING_TIMES NUMBER :=0;
      v_WEIGHTING_PAY_AMOUNT FLOAT :=0.0;
      v_WEIGHT_TIMES NUMBER :=0;
      v_WEIGHT_PAY_AMOUNT FLOAT :=0.0;
      v_HANG_CNTR_TIMES NUMBER :=0;
      v_HANG_CNTR_PAY_AMOUNT FLOAT :=0.0;
      v_TRANS_CNTR_TIMES NUMBER :=0;
      v_TRANS_CNTR_PAY_AMOUNT FLOAT :=0.0;
      v_OT_CNTR_TIMES NUMBER :=0;
      v_OT_CNTR_PAY_AMOUNT FLOAT :=0.0;
      v_DETAIN_FORKLIFT NUMBER :=0;
      v_DTFL_PAY_AMOUNT FLOAT :=0.0;
      v_DETAIN_WORKERS NUMBER :=0;
      v_DTW_HOURS NUMBER :=0;
      v_DTW_PAY_AMOUNT FLOAT :=0.0;
     
      BEGIN
      OPEN paymentOpsCursor;
      LOOP
        FETCH paymentOpsCursor INTO v_paymentOps;
        EXIT WHEN paymentOpsCursor%NOTFOUND;
          IF v_paymentOps.OPS_TYPE = 'GB' THEN
                v_WEIGHTING_TIMES := v_WEIGHTING_TIMES + v_paymentOps.OPS_NUM ; 
                v_WEIGHTING_PAY_AMOUNT := v_WEIGHTING_PAY_AMOUNT + v_paymentOps.ACCOUNT;
          ELSIF v_paymentOps.OPS_TYPE = 'BZ' THEN
                v_WEIGHT_TIMES := v_WEIGHT_TIMES + v_paymentOps.OPS_NUM ;
                v_WEIGHT_PAY_AMOUNT := v_WEIGHT_PAY_AMOUNT + v_paymentOps.ACCOUNT;
          ELSIF v_paymentOps.OPS_TYPE = 'DG' THEN
                v_HANG_CNTR_TIMES := v_HANG_CNTR_TIMES + v_paymentOps.OPS_NUM ;
                v_HANG_CNTR_PAY_AMOUNT := v_HANG_CNTR_PAY_AMOUNT + v_paymentOps.ACCOUNT;
          ELSIF v_paymentOps.OPS_TYPE = 'DX' THEN
                v_TRANS_CNTR_TIMES := v_TRANS_CNTR_TIMES + v_paymentOps.OPS_NUM ;
                v_TRANS_CNTR_PAY_AMOUNT := v_TRANS_CNTR_PAY_AMOUNT + v_paymentOps.ACCOUNT;     
          ELSIF v_paymentOps.OPS_TYPE = 'LF' THEN
                v_OT_CNTR_TIMES := v_OT_CNTR_TIMES + v_paymentOps.OPS_NUM ;
                v_OT_CNTR_PAY_AMOUNT := v_OT_CNTR_PAY_AMOUNT + v_paymentOps.ACCOUNT;
          ELSIF v_paymentOps.OPS_TYPE = 'CC' THEN
                v_DETAIN_FORKLIFT := v_DETAIN_FORKLIFT + v_paymentOps.OPS_NUM ;
                v_DTFL_PAY_AMOUNT := v_DTFL_PAY_AMOUNT + v_paymentOps.ACCOUNT;
          ELSIF v_paymentOps.OPS_TYPE = 'RG' THEN
                v_DETAIN_WORKERS := v_DETAIN_WORKERS + v_paymentOps.OPS_NUM ;
                v_DTW_PAY_AMOUNT := v_DTW_PAY_AMOUNT + v_paymentOps.ACCOUNT;
          END IF;
       END LOOP;          
     
      IF v_WEIGHTING_TIMES != 0 OR v_WEIGHT_TIMES != 0 OR
         v_HANG_CNTR_TIMES != 0 OR v_TRANS_CNTR_TIMES != 0 OR
         v_OT_CNTR_TIMES != 0 OR v_DETAIN_FORKLIFT != 0 OR v_DETAIN_WORKERS != 0
         THEN
            DBMS_OUTPUT.PUT_LINE(
              'INSERT INTO MEMS_PAYMENT_BILL_OPERATION(PAYMENT_BILL_ID, WEIGHTING_TIMES, WEIGHTING_PAY_AMOUNT, '
            );
            DBMS_OUTPUT.PUT_LINE(
              '       WEIGHT_TIMES, WEIGHT_PAY_AMOUNT, HANG_CNTR_TIMES, HANG_CNTR_PAY_AMOUNT, '
            );
            DBMS_OUTPUT.PUT_LINE(
              '       TRANS_CNTR_TIMES, TRANS_CNTR_PAY_AMOUNT, OT_CNTR_TIMES, OT_CNTR_PAY_AMOUNT, '
            );
            DBMS_OUTPUT.PUT_LINE(
              '       DETAIN_FORKLIFT, DTFL_PAY_AMOUNT, DETAIN_WORKERS, DTW_HOURS, DTW_PAY_AMOUNT)'
            );
            DBMS_OUTPUT.PUT_LINE(
              ' VALUES(v_paymentbill_pk , '|| v_WEIGHTING_TIMES ||', '|| v_WEIGHTING_PAY_AMOUNT ||', '||  
                     v_WEIGHT_TIMES ||', '|| v_WEIGHT_PAY_AMOUNT ||', '|| v_HANG_CNTR_TIMES ||', '|| v_HANG_CNTR_PAY_AMOUNT ||', '
            );
            DBMS_OUTPUT.PUT_LINE('       '||
                     v_TRANS_CNTR_TIMES ||', '|| v_TRANS_CNTR_PAY_AMOUNT ||', '|| v_OT_CNTR_TIMES ||', '|| v_OT_CNTR_PAY_AMOUNT ||', '|| 
                     v_DETAIN_FORKLIFT ||', '|| v_DTFL_PAY_AMOUNT ||', '|| v_DETAIN_WORKERS ||', '|| v_DTW_HOURS ||', '|| v_DTW_PAY_AMOUNT ||');'
            ); 
      END IF;      
               
      v_WEIGHTING_TIMES :=0;
      v_WEIGHTING_PAY_AMOUNT :=0.0;
      v_WEIGHT_TIMES :=0;
      v_WEIGHT_PAY_AMOUNT :=0.0;
      v_HANG_CNTR_TIMES :=0;
      v_HANG_CNTR_PAY_AMOUNT :=0.0;
      v_TRANS_CNTR_TIMES :=0;
      v_TRANS_CNTR_PAY_AMOUNT :=0.0;
      v_OT_CNTR_TIMES :=0;
      v_OT_CNTR_PAY_AMOUNT :=0.0;
      v_DETAIN_FORKLIFT :=0;
      v_DTFL_PAY_AMOUNT :=0.0;
      v_DETAIN_WORKERS :=0;
      v_DTW_HOURS :=0;
      v_DTW_PAY_AMOUNT :=0.0;
               
      CLOSE paymentOpsCursor;
      END;
     
      DBMS_OUTPUT.PUT_LINE('v_paymentbill_pk := v_paymentbill_pk + 1;');
      v_paymentbill_rowCount := v_paymentbill_rowCount + 1;
      v_custom_broker_code :=NULL;
      
   END LOOP;
   CLOSE paymentbillCursor;
  
   DBMS_OUTPUT.PUT_LINE('UPDATE ID_GENERATOR SET ID_VALUE = v_paymentbill_pk WHERE ID_KEY=''MEMS_PAYMENT_BILL_ID'';');
   DBMS_OUTPUT.PUT_LINE('DBMS_OUTPUT.PUT_LINE(''import PAYMENT_BILL end.'');');
   DBMS_OUTPUT.PUT_LINE('COMMIT;');
   DBMS_OUTPUT.PUT_LINE('END;');
   COMMIT;
      
   EXCEPTION
    WHEN OTHERS
    THEN
      DBMS_OUTPUT.PUT_LINE('import paymentbill error:' || SQLERRM);
      ROLLBACK;
END;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章