存储过程 从临时表中把数据分倒到多个表,并建立对应关系、历史记录
来源:互联网 发布:别去糟蹋 知乎 编辑:程序博客网 时间:2024/04/28 11:29
--==================================================================== -- NAME: PRO_SD_WEEKLY_IMPORT_TRANS -- DESC: ---执行WEEKLY导入正式库事务操作---- -- IN : IN_BATCH_ID -- : -- : -- OUT : -- HISTORY: 2008-06-11 CREATED -- NOTE: -- --================================================================== PROCEDURE PRO_SD_WEEKLY_IMPORT_TRANS(P_BATCH_ID NUMBER) AS X_DEALERCODE VARCHAR2(10); X_STORE_CATEGORY VARCHAR2(20); X_DITDISTINCT VARCHAR2(20); X_PROVINCE VARCHAR2(60); X_CITY VARCHAR2(60); X_DITNAME VARCHAR2(100); X_ADDRESS VARCHAR2(200); X_PHONE VARCHAR2(200); X_CONTACT VARCHAR2(60); X_MANAGER VARCHAR2(60); X_IS_SNX VARCHAR2(2); X_ZIPCODE VARCHAR2(10); X_IS_WAR VARCHAR2(2); X_RIGHTRECORDS NUMBER(10) := 0; X_DEALERS_DUP NUMBER(10) := 0; X_SALES_DUP NUMBER(10) := 0; X_DEALER_TEMP_ID NUMBER(10); X_SALE_TEMP_ID NUMBER(10) := -1; X_SAD_TEMP_ID NUMBER(10) := -1; X_NEW_DEALER_TEMP_ID NUMBER(10); X_NEW_SALE_TEMP_ID NUMBER(10); X_TEMP_NO VARCHAR2(10); -- 取得本批次所有临时数据id CURSOR CUR_DEALER_TEMP( P_BATCH_ID NUMBER) IS SELECT DIT_ID FROM DEALER_IMPORT_TEMP WHERE DIT_SDB_ID= P_BATCH_ID AND DIT_DEALERCODE IS NOT NULL; -- 取出无效经销商销售代表对应关系的历史ID CURSOR CUR_DEALERS_HIS IS SELECT DHI_ID FROM DEALERS_HISTORY WHERE DHI_UPDATE_DATE IS NULL AND DHI_DLR_IS_W= 'W' AND DHI_STATUS='Y' AND DHI_SAD_ID IN (SELECT SAD_ID FROM SALES_DEALERS WHERE SAD_DMO_ID=-1 AND SAD_STATUS = 'N'); BEGIN --循环以前,把所有的DEALER 状态设置为N UPDATE DEALERS SET DLR_STATUS = 'N' WHERE DLR_ID IS NOT NULL; COMMIT; UPDATE SALES_DEALERS SET SAD_STATUS = 'N' WHERE SAD_DMO_ID = -1 AND SAD_ID IS NOT NULL; COMMIT; FOR REC_DATA IN CUR_DEALER_TEMP( P_BATCH_ID) LOOP X_TEMP_NO := REC_DATA.DIT_ID; --搜出临时库中一条数据, --导入到正式表中,顺序为:SALES 和 DEALERS -》 SALESDEALER SELECT DIT_DEALERCODE, DIT_STORE_CATEGORY, DIT_DISTINCT, DIT_PROVINCE, DIT_CITY, DIT_NAME, DIT_ADDRESS, DIT_PHONE, DIT_CONTACT, DIT_MANAGER, DIT_IS_SNX, DIT_ZIPCODE, DIT_IS_WAR INTO X_DEALERCODE, X_STORE_CATEGORY, X_DITDISTINCT, X_PROVINCE, X_CITY, X_DITNAME, X_ADDRESS, X_PHONE, X_CONTACT, X_MANAGER, X_IS_SNX, X_ZIPCODE, X_IS_WAR FROM DEALER_IMPORT_TEMP WHERE DIT_ID = X_TEMP_NO; -- 如果DEALER_CODE 或 SALES_NAME 为空 ,结束操作,不插入任何一条记录 IF X_DEALERCODE IS NULL OR X_MANAGER IS NULL THEN ROLLBACK; END IF; --正式库记录加一 X_RIGHTRECORDS := X_RIGHTRECORDS + 1; BEGIN --首先判断DEALER的CODE是否存在,如果原记录中有相应的DEALER 更新DEALERS 表, SELECT DLR_ID INTO X_DEALER_TEMP_ID FROM DEALERS WHERE DLR_CODE = X_DEALERCODE; EXCEPTION WHEN NO_DATA_FOUND THEN X_DEALER_TEMP_ID := -1; END; IF X_DEALER_TEMP_ID > 0 THEN UPDATE DEALERS SET DLR_PROVINCE = X_PROVINCE, DLR_CITY = X_CITY, DLR_NAME = X_DITNAME, DLR_ADDRESS = X_ADDRESS, DLR_TEL = X_PHONE, DLR_CONTACT = X_CONTACT, DLR_ONWAY_FLAG = X_IS_SNX, DLR_CATEGORY = X_STORE_CATEGORY, DLR_TYPE = X_STORE_CATEGORY, DLR_POSTCODE = X_ZIPCODE, DLR_WAR_FLAG = X_IS_WAR, DLR_UPDATE_DATE = SYSDATE, DLR_STATUS = 'Y', DLR_LBR_BATCH_NUMBER_UPDATE = P_BATCH_ID WHERE DLR_ID = X_DEALER_TEMP_ID; COMMIT; X_DEALERS_DUP := X_DEALERS_DUP + 1; X_NEW_DEALER_TEMP_ID := X_DEALER_TEMP_ID; ELSE INSERT INTO DEALERS (DLR_ID, DLR_CODE, DLR_TYPE, DLR_CREATE_DATE, DLR_PROVINCE, DLR_CITY, DLR_NAME, DLR_ADDRESS, DLR_TEL, DLR_CONTACT, DLR_ONWAY_FLAG, DLR_CATEGORY, DLR_POSTCODE, DLR_WAR_FLAG, DLR_STATUS, DLR_LBR_BATCH_NUMBER_CREATE) VALUES (DLR_ID_S.NEXTVAL, X_DEALERCODE, X_STORE_CATEGORY, SYSDATE, X_PROVINCE, X_CITY, X_DITNAME, X_ADDRESS, X_PHONE, X_CONTACT, X_IS_SNX, X_STORE_CATEGORY, X_ZIPCODE, X_IS_WAR, 'Y', P_BATCH_ID); COMMIT; SELECT DLR_ID_S.CURRVAL INTO X_NEW_DEALER_TEMP_ID FROM DUAL; END IF; --如果SAL_NAME不对应则更新 SALES表,否则插入一条记录 BEGIN SELECT SAL_ID INTO X_SALE_TEMP_ID FROM SALES WHERE SAL_NAME = X_MANAGER AND SAL_CATEGORY = 'W'; EXCEPTION WHEN NO_DATA_FOUND THEN X_SALE_TEMP_ID := -1; END; IF X_SALE_TEMP_ID > 0 THEN UPDATE SALES SET SAL_OFFICE = X_DITDISTINCT, SAL_UPDATE_DATE = SYSDATE WHERE SAL_ID = X_SALE_TEMP_ID; COMMIT; X_SALES_DUP := X_SALES_DUP + 1; X_NEW_SALE_TEMP_ID := X_SALE_TEMP_ID; ELSE INSERT INTO SALES (SAL_ID, SAL_NAME, SAL_OFFICE, SAL_CATEGORY, SAL_CREATE_DATE) VALUES (SAL_ID_S.NEXTVAL, X_MANAGER, X_DITDISTINCT, 'W', SYSDATE); COMMIT; SELECT SAL_ID_S.CURRVAL INTO X_NEW_SALE_TEMP_ID FROM DUAL; END IF; --实现SALES和DEALERS表的关系映射 BEGIN SELECT SAD_ID INTO X_SAD_TEMP_ID FROM SALES_DEALERS WHERE SAD_DLR_ID = X_NEW_DEALER_TEMP_ID AND SAD_SAL_ID = X_NEW_SALE_TEMP_ID AND SAD_DMO_ID = -1; EXCEPTION WHEN NO_DATA_FOUND THEN X_SAD_TEMP_ID := -1; END; IF X_SAD_TEMP_ID > 0 THEN UPDATE SALES_DEALERS SET SAD_STATUS = 'Y' WHERE SAD_ID = X_SAD_TEMP_ID; COMMIT; SELECT DHI_STATUS INTO X_TEMP_NO FROM DEALERS_HISTORY WHERE DHI_SAD_ID = X_SAD_TEMP_ID AND DHI_DLR_IS_W = 'W' AND DHI_UPDATE_DATE IS NULL; --上一次对应关系,历史无效,新增历史对应关系,标记原有历史结束时间 IF X_TEMP_NO = 'N' THEN INSERT INTO DEALERS_HISTORY (DHI_ID, DHI_CREATE_DATE, DHI_STATUS, DHI_DLR_IS_W, DHI_SAD_ID) VALUES (DHI_ID_S.NEXTVAL, SYSDATE, 'Y', 'W', X_SAD_TEMP_ID); UPDATE DEALERS_HISTORY SET DHI_UPDATE_DATE = SYSDATE WHERE DHI_SAD_ID = X_SAD_TEMP_ID AND DHI_STATUS = 'N' AND DHI_DLR_IS_W = 'W' AND DHI_UPDATE_DATE IS NULL; COMMIT; END IF; ELSE INSERT INTO SALES_DEALERS (SAD_ID, SAD_DLR_ID, SAD_SAL_ID, SAD_DMO_ID, SAD_STATUS) VALUES (SAD_ID_S.NEXTVAL, X_NEW_DEALER_TEMP_ID, X_NEW_SALE_TEMP_ID, -1, 'Y'); INSERT INTO DEALERS_HISTORY (DHI_ID, DHI_CREATE_DATE, DHI_STATUS, DHI_DLR_IS_W, DHI_SAD_ID) VALUES (DHI_ID_S.NEXTVAL, SYSDATE, 'Y', 'W', SAD_ID_S.CURRVAL); COMMIT; END IF; END LOOP; FOR REC_DEALER IN CUR_DEALERS_HIS LOOP X_TEMP_NO := REC_DEALER.DHI_ID; SELECT DHI_SAD_ID INTO X_SAD_TEMP_ID FROM DEALERS_HISTORY WHERE DHI_ID = X_TEMP_NO; INSERT INTO DEALERS_HISTORY (DHI_ID, DHI_CREATE_DATE, DHI_STATUS, DHI_DLR_IS_W, DHI_SAD_ID) VALUES (DHI_ID_S.NEXTVAL, SYSDATE, 'N', 'W', X_SAD_TEMP_ID); COMMIT; UPDATE DEALERS_HISTORY SET DHI_UPDATE_DATE = SYSDATE WHERE DHI_ID = X_TEMP_NO; COMMIT; END LOOP; --导入到正式表结束,更新经销商销售代表导入批次表记录 --有:导入状态,正式库记录 --导入正式库结束时间 UPDATE SALES_DEALERS_BATCH SET SDB_LOAD_STATUS = 3, SDB_ERROR_COUNT = SDB_TEMP_COUNT - X_RIGHTRECORDS, SDB_FORMER_COUNT = X_RIGHTRECORDS, SDB_DEALERS_DUPLICATE = X_DEALERS_DUP, SDB_SALES_DUPLICATE = X_SALES_DUP, SDB_DB_END = SYSDATE WHERE SDB_ID = P_BATCH_ID; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END PRO_SD_WEEKLY_IMPORT_TRANS;
- 存储过程 从临时表中把数据分倒到多个表,并建立对应关系、历史记录
- mysql存储过程建立临时表,从别的表赋值给这个临时表
- 存储过程 建立临时表 通过循环
- 关于sql server 在存储过程中创建临时表,并往临时表中插入数据时出现乱码的问题
- 从ADO中建立临时表、
- 把存储过程结果集插入临时表
- 把存储过程结果集插入临时表
- 把存储过程结果集SELECT INTO到临时表
- 把存储过程结果集SELECT INTO到临时表
- 在存储过程中使用临时表
- 存储过程中使用临时表.
- 在存储过程中创建临时表
- mysql存储过程中使用临时表
- Oracle存储过程中使用临时表
- Oracle存储过程中使用临时表
- Oracle存储过程中使用临时表
- Oracle存储过程中使用临时表
- Oracle存储过程中使用临时表
- 应聘和招聘的矛盾论
- 开发dll 相关的设置问题
- C++使用心得
- Oracle使用心得
- Debug破解技术
- 存储过程 从临时表中把数据分倒到多个表,并建立对应关系、历史记录
- 常用信息技术计量单位
- mod_perl简单一例
- Linux 常见问题 1000 个详细解答
- C/C++ call stack traces
- 鲜为人知 的 人名典故
- 屏幕抓字技术揭密
- 下一代智能手机设计发展趋势
- .NET面试汇总