Обновление FORALL L OOP in oracle не относится к предложению where (внутри SAS pro c sql) - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь обновить более 500 миллионов записей с помощью l oop внутри pro c sql SAS, я хочу взять значение NG_OFRRELPRD1 из CMBATCH.HashedCNumbers и поместить его в CDM.EVN_OFFER_ARCH, используя Поле UNIQUE_ID в обеих таблицах. Вот код, который я использую:

proc sql noprint;

    connect using CDM as oracle ;
    execute(
DECLARE 
    CURSOR cur_UNIQ IS SELECT UNIQUE_ID FROM CMBATCH.HashedCNumbers; 
    TYPE tab_KEY IS TABLE OF cur_UNIQ%ROWTYPE INDEX BY PLS_INTEGER; 
    array_unique_id_KEY tab_KEY; 

BEGIN 
    dbms_output.put_line(CHR(9)||'Zaczynam kopiowanie danych: '||TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS'));

    OPEN cur_UNIQ; 
    LOOP FETCH cur_UNIQ BULK COLLECT INTO array_unique_id_KEY LIMIT 10000; 
    EXIT WHEN array_unique_id_KEY.count=0; 

    FORALL indx IN 1 .. array_unique_id_KEY.COUNT SAVE EXCEPTIONS
        UPDATE CDM.MDM_EVN_OFFER_ARCH SET NG_OFRRELPRD1 = (SELECT NG_OFRRELPRD1 FROM CMBATCH.HashedCNumbers WHERE  
        CMBATCH.HashedCNumbers.UNIQUE_ID=array_unique_id_KEY(indx).UNIQUE_ID); 
        COMMIT WRITE batch WAIT; 
    END LOOP; 


    CLOSE cur_UNIQ; 
    dbms_output.put_line(CHR(9)||'Dane skopiowane: '||TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS')); 
END;
by oracle;  

    disconnect from oracle;
QUIT;

Соединение sas oracle правильное, так как я могу связываться с БД. Проблема в том, что этот l oop не соответствует моему предложению WHERE и не присоединяется по UNIQUE_ID из другой таблицы. Он принимает первое значение NG_OFRRELPRD и обновляет каждую строку в целевой таблице на первой итерации.

Что здесь может быть не так?

1 Ответ

3 голосов
/ 17 января 2020

Я думаю, что вы хотите проверить значение, которое вы обновляете; Я полагаю, что это НЕ первое значение NG_OFRRELPRD и обновляет каждую строку, кроме последней. Это НЕ игнорирует ваше предложение where, но оно у вас не в том месте. Если вы отформатируете свой запрос, вы увидите, что это предложение только для подвыбора, а не для обновления. Следовательно, без предложения where каждая строка обновляется со значением, выбранным для каждой строки, выбранной в коллекции.

UPDATE CDM.MDM_EVN_OFFER_ARCH 
   SET NG_OFRRELPRD1 = (SELECT NG_OFRRELPRD1 
                          FROM CMBATCH.HashedCNumbers 
                         WHERE  CMBATCH.HashedCNumbers.UNIQUE_ID=array_unique_id_KEY(indx).UNIQUE_ID); 

Возможно, вы имели в виду что-то вроде:

update cdm.mdm_evn_offer_arch offer
   set ng_ofrrelprd1 = (select ng_ofrrelprd1 
                          from cmbatch.hashedcnumbers hnum 
                         where huum.unique_id=array_unique_id_key(indx).unique_id) 
where offer.unique_id = array_unique_id_key(indx).unique_id;
...