Сравнение данных двух таблиц, если они различаются, необходимо обновлять код постоянно и никогда не заканчивается - PullRequest
0 голосов
/ 22 декабря 2019

имеют 2 таблицы. Prod и dev. мое требование: мне нужно сравнить данные dev с prod, и если значение столбца равно нулю, мне нужно обновить его как «NULL» как строку.

таблицы содержат 1000 строк данных.

Да, они одинаковыструктура, так как я буду создавать таблицы TEMP A с

(REVISIONCODE                 NOT NULL VARCHAR2(60)                
KEY_1                        NOT NULL VARCHAR2(60) ,ATTRIBUTE_CATEGORY                    VARCHAR2(60)                
ATTRIBUTE_INDEX                       VARCHAR2(60)                
ATTRIBUTE_STATE                       VARCHAR2(60) ).
A will be compared with B

(REVISIONCODE                 NOT NULL VARCHAR2(60)                
KEY_1                        NOT NULL VARCHAR2(60) ,ATTRIBUTE_CATEGORY                    VARCHAR2(60)                
ATTRIBUTE_INDEX                       VARCHAR2(60)                
ATTRIBUTE_STATE                       VARCHAR2(60) ).
Here Data A(DEV) is having as

REVISIONCODE        KEY_1                 Category   Index
IN_PROD             360View                         store       
IN_PROD             Alternate display name          Index
IN_PROD             Book product                    store     
Data for B(PROD) is

REVISIONCODE    KEY_1                    Category   Index
IN_PROD       360View                               Store
IN_PROD       Alternate display name        null    Index   
IN_PROD       Book product                          Store

здесь, когда я смотрю данные чужой таблицы B столбец key_1 Альтернативный столбец категории отображаемого имени содержит данные как «ноль», где в том же столбце данные пусты.

для этой строки мне нужно обновить данные таблицы A строки для категории столбца как «ноль». и еще одна вещь в таблице A для key_1. Значение столбца категории 360_view в таблице B пустое, а также значение пустое, поэтому мне не нужно об этом думать.

, поскольку вы можете помочь мне эффективным способом написать

Мне нужно сравнить 12 столбцов в таблице.

для этого я написал код как

DECLARE
CURSOR C1 is select * FROM PROD  ;
CURSOR C2 IS select * FROM DEV  ;

     TYPE t_stg_tab IS TABLE OF C1%ROWTYPE;
     c1_var    t_stg_tab   ;

     TYPE t_non_prod_tab IS TABLE OF C2%ROWTYPE;
     c2_var    t_non_prod_tab ;


     v_prod_upd_cntr PLS_INTEGER        := 0;
     l_rec_cnt       NUMBER          := 0;
         start_date      DATE            := sysdate;

BEGIN

OPEN c1;

    FETCH c1   BULK COLLECT INTO c1_var ;
     OPEN c2;
      FETCH c2  BULK COLLECT INTO c2_var ;

    FOR I IN 1..C1_VAR.COUNT LOOP

        FOR J IN 1..C2_VAR.COUNT LOOP

  IF c2_var(j).revisioncode =c1_var(i).revisioncode and c2_var(j).key_1 = c1_var(i).key_1 then
                dbms_output.put_line('c1_var(i).attribute_category'||c1_var(i).attribute_category||'c1_var(i).revisioncode'||c1_var(i).revisioncode||'c2_var(j).key_1'||c2_var(j).key_1);
                dbms_output.put_line('c2_var(j).attribute_category'||c2_var(j).attribute_category||'c2_var(j).revisioncode'||c2_var(j).revisioncode||'c2_var(j).key_1'||c2_var(j).key_1);

                IF c1_var(i).attribute_category is not null then
            IF c1_var(i).attribute_category = 'null' and c2_var(j).attribute_category is null then
                dbms_output.put_line('c2_var(j).attribute_category_empty_need_update'||c2_var(j).attribute_category);
            --    UPDATE P_MD_CE05_ATR_RVSNCD_KEY_TST set attribute_category = 'null' where  revisioncode = c2_var(j).revisioncode and key_1 = c2_var(j).key_1 ;
                        l_update_attribute_category := 'null';
            ELSE
                dbms_output.put_line('c2_var(j).attribute_category_No update'||c2_var(j).attribute_category);
            END IF;
                END IF;
 END IF;

         UPDATE P_MD_CE05_ATR_RVSNCD_KEY_TST set attribute_category = l_update_attribute_category  ;

 l_rec_cnt := SQL%ROWCOUNT;
                v_prod_upd_cntr := v_prod_upd_cntr + l_rec_cnt;

                DBMS_OUTPUT.PUT_LINE('NON_PROD_DATA: ' || v_prod_upd_cntr || ' records: starting @ ' || sysdate);
                        DBMS_APPLICATION_INFO.SET_CLIENT_INFO(start_date||'-up2-'|| v_prod_upd_cntr ||'-'|| sysdate);
END LOOP;


        DBMS_OUTPUT.PUT_LINE('after first end loop rowcount_value'||i);

            DBMS_OUTPUT.PUT_LINE('NON_PROD_DATA: ' || v_prod_upd_cntr || ' records: starting @ ' || sysdate);
                DBMS_APPLICATION_INFO.SET_CLIENT_INFO(start_date||'-up2-'|| v_prod_upd_cntr ||'-'|| sysdate);
END LOOP;
            DBMS_OUTPUT.PUT_LINE('NON_PROD_DATA: ' || v_prod_upd_cntr || ' records: starting @ ' || sysdate);
        DBMS_APPLICATION_INFO.SET_CLIENT_INFO(start_date||'-up2-'|| v_prod_upd_cntr ||'-'|| sysdate);
   --   DBMS_OUTPUT.PUT_LINE('at end rowcount_value1'||i||'rowcount2'||j);
Exception
when others then
dbms_output.put_Line('SQLCODE'||SQLCODE||' -ERROR- '||SQLERRM)  ;

END;

Когда я выполняю БД, не отвечающую. Мне нужно отменить операцию.

1 Ответ

0 голосов
/ 23 декабря 2019

Пожалуйста, просмотрите Как спросить . Следование этому шаблону значительно увеличивает ваши шансы получить удовлетворительный ответ. В этом конкретном случае ваше описание не имеет смысла. Попробуйте описать вашу проблему в бизнес-терминах, а затем опубликуйте фактический DDL для ваших таблиц. Также предоставьте образцы тестовых данных - в виде текста, а не изображения - а также ожидаемые результаты из этих данных.

Что касается вашего кода, то по сути это NESTED LOOP JOIN, и написание его самостоятельно - это самый медленный из возможных способов. Как указано, у вас есть 1M итераций, и вы обновляете каждую строку в целевой таблице на каждой из них.

Так что напишите как JOIN. Oracle уже более 40 лет работает над этим, и я уверяю вас, они намного лучше, чем кто-либо из нас. И при соответствующей индексации Oracle может предложить гораздо лучший метод. Следующее должно реализовать ваш цикл и if структуры (кроме обновления).

select c1.*, c2.*
  from prod  c1
  join dev   c2
    on (c2.revisioncode = c1.revivioncode and
        c2.key_1        = c1.key_1
       )
 where c1.attribute_category = 'null'
   and c2.attribute_category is null;

Результат должен содержать те же строки, которые прошли бы операторы IF и выполнили оператор l_update_attribute_category := 'null';Приведенный выше оператор SQL будет работать автономно, но не будет выполняться в блоке процедуры. Это потому, что я не пытался выполнить обновление, поскольку вы не указали связь между таблицами Prod и / или Dev. Это предполагает, что Prod и Dev относятся к таблицам , а не к средам. (Я подозреваю, что это среды). Пересмотрите свой вопрос, если они среды. Я предполагаю, что несколько, но я бы предположил, что это можно сделать в одном операторе SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...