oracle 数据同步

CREATE OR REPLACE PROCEDURE C2U.pro_send_contact_ecp (
   p_send_data IN VARCHAR2)
----p_send_data  Y: send data to ecp   N: Just update snapshot table in local site

IS
   CURSOR c_customer
   IS
      SELECT cust_party_id,
             customer_name_cn,
             customer_name_en,
             customer_name_alias,
             NVL (cust_grade, 'C0') cust_grade,
             status,
             customer_type,
             url,
             null real_erp_id
        FROM apps.web_customer_master_v@to_240_apps
      UNION ALL
      SELECT party_id cust_party_id,
             customer_name customer_name_cn,
             NULL customer_name_en,
             NULL customer_name_alias,
             NVL ( (SELECT MAX (cust_grade)
                      FROM c2u_ncd_contact_master nc
                     WHERE nc.cust_party_id = cus.party_id),
                  'C0')
                cust_grade,
             'A' status,
             '客户' customer_type,
             NULL url,
             mapping_party_id real_erp_id
        FROM c2u_ncd_customer_master cus
       WHERE party_id IS NOT NULL
       and customer_name is not null;

   CURSOR c_contact
   IS
      SELECT *
        FROM (SELECT contact_id,
                     cust_party_id,
                     chinese_name,
                     english_name,
                     dept,
                     dept_type,
                     title,
                     title_type,
                     phones,
                     emails,
                     sex,
                     address_cn,
                     address_en,
                     status
                FROM web_contact_master_v
                where dept_type in
                        ('供应链',
                        '公司高管',
                        '研发',
                        '生产制造' ---- cory_liu 20160902 add
                        )
              UNION ALL
              SELECT contact_id,
                     cust_party_id,
                     chinese_name,
                     NULL english_name,
                     dept,
                     NULL dept_type,
                     title,
                     NULL title_type,
                     phones,
                     emails,
                     sex,
                     address_cn,
                     NULL address_en,
                     'A' status
                FROM c2u_ncd_contact_master);

   v_customer_str         VARCHAR2 (30000);
   v_customer_send_date   DATE;

   v_contact_str          VARCHAR2 (30000);
   v_contact_send_date    DATE;
   v_ecm_date_str         VARCHAR2 (30);
BEGIN
   ----- customer data
   --- step 1 , update snapshot table
   FOR r_customer IN c_customer
   LOOP
      BEGIN
         SELECT    customer_name_cn
                || customer_name_en
                || customer_name_alias
                || NVL (cust_grade, 'C0')
                || status
                || customer_type
                || url
                || real_erp_id
           INTO v_customer_str
           FROM t_erp_company_snapshot
          WHERE cust_party_id = r_customer.cust_party_id;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            v_customer_str := NULL;
      END;

      IF v_customer_str IS NULL
      THEN
         INSERT INTO t_erp_company_snapshot (cust_party_id,
                                             CUSTOMER_NAME_CN,
                                             CUSTOMER_NAME_EN,
                                             CUSTOMER_NAME_ALIAS,
                                             CUST_GRADE,
                                             STATUS,
                                             CUSTOMER_TYPE,
                                             URL,
                                             real_erp_id,
                                             UPDATE_DATE)
              VALUES (r_customer.cust_party_id,
                      r_customer.CUSTOMER_NAME_CN,
                      r_customer.CUSTOMER_NAME_EN,
                      r_customer.CUSTOMER_NAME_ALIAS,
                      r_customer.CUST_GRADE,
                      r_customer.STATUS,
                      r_customer.CUSTOMER_TYPE,
                      r_customer.URL,
                      r_customer.real_erp_id,
                      SYSDATE);
      ELSIF v_customer_str <>
                  r_customer.customer_name_cn
               || r_customer.customer_name_en
               || r_customer.customer_name_alias
               || NVL (r_customer.cust_grade, 'C0')
               || r_customer.status
               || r_customer.customer_type
               || r_customer.url
               || r_customer.real_erp_id
      THEN
         UPDATE t_erp_company_snapshot
            SET CUSTOMER_NAME_CN = r_customer.CUSTOMER_NAME_CN,
                CUSTOMER_NAME_EN = r_customer.CUSTOMER_NAME_EN,
                CUSTOMER_NAME_ALIAS = r_customer.CUSTOMER_NAME_ALIAS,
                CUST_GRADE = r_customer.CUST_GRADE,
                STATUS = r_customer.STATUS,
                CUSTOMER_TYPE = r_customer.CUSTOMER_TYPE,
                URL = r_customer.URL,
                real_erp_id = r_customer.real_erp_id,
                UPDATE_DATE = SYSDATE
          WHERE cust_party_id = r_customer.cust_party_id;
      END IF;
   END LOOP;

   COMMIT;

   --- step 2 , get last send date
   SELECT last_send_date
     INTO v_customer_send_date
     FROM c2u_send_contact_ecp_control
    WHERE data_table = 'T_ERP_COMPANY';

   --- step 3 , send data
   IF p_send_data = 'Y'
   THEN
      BEGIN
         FOR i IN (SELECT *
                     FROM t_erp_company_snapshot
                    WHERE update_date > v_customer_send_date)
         LOOP
            INSERT INTO t_erp_company (erp_id,
                                       erp_name,
                                       erp_name_second,
                                       erp_other_name,
                                       ep_level,
                                       state,
                                       ep_type,
                                       web_site,
                                       real_erp_id)
                 VALUES (i.cust_party_id,
                         i.customer_name_cn,
                         i.customer_name_en,
                         i.customer_name_alias,
                         i.cust_grade,
                         i.status,
                         i.customer_type,
                         i.url,
                         i.real_erp_id);

            COMMIT;
         END LOOP;
      END;

      ---step 4 , update last send date
      UPDATE c2u_send_contact_ecp_control
         SET last_send_date = SYSDATE
       WHERE data_table = 'T_ERP_COMPANY';
   END IF;

   COMMIT;


   ----- contact data
   --- step 1 , update snapshot table

   FOR r_contact IN c_contact
   LOOP
      BEGIN
         SELECT    CUST_PARTY_ID
                || CHINESE_NAME
                || ENGLISH_NAME
                || DEPT
                || DEPT_TYPE
                || TITLE
                || TITLE_TYPE
                || PHONES
                || EMAILS
                || SEX
                || ADDRESS_CN
                || ADDRESS_EN
                || STATUS
           INTO v_contact_str
           FROM t_erp_contacts_snapshot
          WHERE contact_id = r_contact.contact_id;
      EXCEPTION
         WHEN NO_DATA_FOUND
         THEN
            v_contact_str := NULL;
      END;

      IF v_contact_str IS NULL
      THEN
         INSERT INTO t_erp_contacts_snapshot (contact_id,
                                              CUST_PARTY_ID,
                                              CHINESE_NAME,
                                              ENGLISH_NAME,
                                              DEPT,
                                              DEPT_TYPE,
                                              TITLE,
                                              TITLE_TYPE,
                                              PHONES,
                                              EMAILS,
                                              SEX,
                                              ADDRESS_CN,
                                              ADDRESS_EN,
                                              STATUS,
                                              UPDATE_DATE)
              VALUES (r_contact.contact_id,
                      r_contact.CUST_PARTY_ID,
                      r_contact.CHINESE_NAME,
                      r_contact.ENGLISH_NAME,
                      r_contact.DEPT,
                      r_contact.DEPT_TYPE,
                      r_contact.TITLE,
                      r_contact.TITLE_TYPE,
                      r_contact.PHONES,
                      r_contact.EMAILS,
                      r_contact.SEX,
                      r_contact.ADDRESS_CN,
                      r_contact.ADDRESS_EN,
                      r_contact.STATUS,
                      SYSDATE);
      ELSIF v_contact_str <>
                  r_contact.CUST_PARTY_ID
               || r_contact.CHINESE_NAME
               || r_contact.ENGLISH_NAME
               || r_contact.DEPT
               || r_contact.DEPT_TYPE
               || r_contact.TITLE
               || r_contact.TITLE_TYPE
               || r_contact.PHONES
               || r_contact.EMAILS
               || r_contact.SEX
               || r_contact.ADDRESS_CN
               || r_contact.ADDRESS_EN
               || r_contact.STATUS
      THEN
         UPDATE t_erp_contacts_snapshot
            SET CUST_PARTY_ID = r_contact.CUST_PARTY_ID,
                CHINESE_NAME = r_contact.CHINESE_NAME,
                ENGLISH_NAME = r_contact.ENGLISH_NAME,
                DEPT = r_contact.DEPT,
                DEPT_TYPE = r_contact.DEPT_TYPE,
                TITLE = r_contact.TITLE,
                TITLE_TYPE = r_contact.TITLE_TYPE,
                PHONES = r_contact.PHONES,
                EMAILS = r_contact.EMAILS,
                SEX = r_contact.SEX,
                ADDRESS_CN = r_contact.ADDRESS_CN,
                ADDRESS_EN = r_contact.ADDRESS_EN,
                STATUS = r_contact.STATUS,
                UPDATE_DATE = SYSDATE
          WHERE contact_id = r_contact.contact_id;
      END IF;
   END LOOP;


   COMMIT;

   --- step 2 , get last send date
   SELECT last_send_date
     INTO v_contact_send_date
     FROM c2u_send_contact_ecp_control
    WHERE data_table = 'T_ERP_CONTACTS';

   SELECT TO_CHAR (v_contact_send_date, 'yyyymmddhh24miss')
     INTO v_ecm_date_str
     FROM DUAL;

   IF p_send_data = 'Y'
   THEN
      --- step 3 , send data

      BEGIN
         FOR i IN (SELECT *
                     FROM t_erp_contacts_snapshot
                    WHERE update_date > v_contact_send_date)
         LOOP
           -- dbms_output.put (i.contact_id);

            INSERT INTO t_erp_contacts (erp_id,
                                        erp_company_id,
                                        name,
                                        name_second,
                                        dept,
                                        dept_type,
                                        position,
                                        position_type,
                                        link_data,
                                        email,
                                        sex,
                                        -- address_ch,
                                        -- address_en,
                                        state)
                 VALUES (i.contact_id,
                         i.cust_party_id,
                         i.chinese_name,
                         i.english_name,
                         i.dept,
                         i.dept_type,
                         i.title,
                         i.title_type,
                         i.phones,
                         i.emails,
                         i.sex,
                         -- i.address_cn,
                         -- i.address_en,
                         i.status);


            UPDATE t_erp_contacts
               SET address_ch = i.address_cn
             WHERE     erp_id = i.contact_id
                   AND CREATE_TIME >
                          TO_DATE (v_ecm_date_str, 'yyyymmddhh24miss');

            UPDATE t_erp_contacts
               SET address_en = i.address_en
             WHERE     erp_id = i.contact_id
                   AND CREATE_TIME >
                          TO_DATE (v_ecm_date_str, 'yyyymmddhh24miss');

            dbms_output.put_line ('ok');
            COMMIT;
         END LOOP;
      END;

      ---step 4 , update last send date
      UPDATE c2u_send_contact_ecp_control
         SET last_send_date = SYSDATE
       WHERE data_table = 'T_ERP_CONTACTS';
   END IF;

   COMMIT;
END;
/

posted @ 2017-02-06 17:39  albert_think  阅读(180)  评论(0编辑  收藏  举报