--當數據量很大時,如果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;