|
|
用数组做游标的中介,也就是首先把游标的数据copy到数组里;
然后通过循环数组做处理,这样循环数组的内部就可以任意写commit,rollback;
按照这个思路,我程序写出来了,
下面凡是ERP_开头的表,其实都是sqlserver的表,我用同义词转了一下;
--同步客户资料(业务单位表)
PROCEDURE SYNC_CUST(p_xgsj date,
p_code out pls_integer,
p_msg out varchar2) IS
v_date1 NUMBER;
v_date2 NUMBER;
TYPE TArr_ERP_KHZL IS TABLE OF ERP_KHZL%ROWTYPE INDEX BY BINARY_INTEGER;
Arr_ERP_KHZL TArr_ERP_KHZL;
i simple_integer := 0;
V_SNYC_A_CNT SIMPLE_INTEGER := 0;
V_SNYC_U_CNT SIMPLE_INTEGER := 0;
PROCEDURE reglog IS
BEGIN
v_date2 := dbms_utility.get_time;
Crea_sync_Log('同步客户资料',
p_code,
p_msg,
'ERP_SYNC.SYNC_CUST',
TO_CHAR((v_date2 - v_date1) / 100));
END;
BEGIN
v_date1 := dbms_utility.get_time;
V_SNYC_A_CNT := 0;
V_SNYC_U_CNT := 0;
FOR REC IN (SELECT
A.KHID, --1、客户ID
A.KHDH, --2、客户代号
A.KHJC, --3、客户简称
A.KHMC, --4、客户名称
A.XGSJ --5、修改时间
FROM ERP_KHZL A --业务单位表
where A.XGSJ > p_xgsj
) --客户资料
LOOP
i := i + 1;
Arr_ERP_KHZL(i) := rec;
END LOOP;
for j in Arr_ERP_KHZL.first .. Arr_ERP_KHZL.last loop
-- dbms_output.put_line(Arr_ERP_KHZL(j).khid);
UPDATE CUST A
SET A.CUST_ID = Arr_ERP_KHZL(j).KHID, --1、客户内码
A.CUST_NO = Arr_ERP_KHZL(j).KHDH, --2、客户编号
A.CUST_NAME = Arr_ERP_KHZL(j).KHMC, --3、客户名称
A.CUST_SHORT_NAME = Arr_ERP_KHZL(j).KHJC, --4、客户简称
A.UPDATE_TIME = Arr_ERP_KHZL(j).XGSJ --6、更新时间
WHERE A.CUST_ID = Arr_ERP_KHZL(j).KHID;
if sql%rowcount = 0 then
INSERT INTO CUST --客户资料
(CUST_ID, --1、客户内码
CUST_NO, --2、客户编号
CUST_NAME, --3、客户名称
CUST_SHORT_NAME, --4、客户简称
CREA_TIME, --5、创建时间
UPDATE_TIME --6、更新时间
)
VALUES
(Arr_ERP_KHZL(j).KHID,
Arr_ERP_KHZL(j).KHDH,
Arr_ERP_KHZL(j).KHMC,
Arr_ERP_KHZL(j).KHJC,
Arr_ERP_KHZL(j).XGSJ,
Arr_ERP_KHZL(j).XGSJ);
COMMIT;
V_SNYC_A_CNT := V_SNYC_A_CNT + 1;
ELSE
COMMIT;
V_SNYC_U_CNT := V_SNYC_U_CNT + 1;
END IF;
commit;
end loop;
--同步完之后,修改max_read_id
UPDATE ERP_SYS_IFDB_JCSJ_GC --基本信息识别记录表-冈村
SET YDXGSJ = p_xgsj --3、已读修改时间
WHERE TABLENAME = 'KHZL'; --2、接口表名
COMMIT; --非常重要,否者会导致分布式事务不一致;
p_code := 0;
p_msg := '同步客户信息成功,添加' || to_char(V_SNYC_A_CNT) || '条' || '修改' ||
to_char(V_SNYC_U_CNT) || '条';
reglog;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
p_code := SQLCODE;
p_msg := SUBSTR(SQLERRM, 1, 100);
reglog;
END;
[ 本帖最后由 qingyun 于 2010-8-20 00:55 编辑 ] |
|