2017-02-08 20 views
1

Каков наилучший способ получения и вывода количества строк, которые были вставлены в оператор FORALL, который у меня ниже. Я видел SQL% BULK_ROWCOUNT, но я не уверен, как это работает в приведенном ниже описании.Oracle PL/SQL, как вы выводите, сколько вставок было сделано в операторе FORALL

это

DBMS_OUTPUT.('rows inserted '||SQL%BULK_ROWCOUNT||''); 

ли вышеупомянутую необходимость идти в другом заявлении FORALL? Для кода ниже, как я могу это достичь?

DECLARE 
    TYPE t_arc_act_plus_trigger1 IS TABLE OF arc_act_plus_triggers1%ROWTYPE; 
    v_arc_act_plus_triggers1 t_arc_act_plus_trigger1; 

    CURSOR c_arc_act_plus_triggers1 IS 
     SELECT /*+ PARALLEL */ apt.* 
     FROM act_plus_triggers1 apt 
     WHERE NOT EXISTS 
       (SELECT 1 
        FROM act_plus_triggers_copy1 aptc 
        WHERE aptc.surr_id = apt.surr_id) 
     AND apt.status IN ('EXT', 'EXP'); 
BEGIN 

    OPEN c_arc_act_plus_triggers1; 
    LOOP 
     FETCH c_arc_act_plus_triggers1 BULK COLLECT INTO v_arc_act_plus_triggers1 LIMIT 10000; -- limit to 10k to avoid out of memory 

     FORALL i IN 1..v_arc_act_plus_triggers1.COUNT 
     INSERT /*+ APPEND_VALUES */ INTO arc_act_plus_triggers1 values v_arc_act_plus_triggers1(i); 


     Com0932.get_parameter ('ACT_ARCHIVE_TRIGGER_STOP_YN',l_STOP_PROGRAM_YN);   
     IF l_STOP_PROGRAM_YN = 'Y' THEN 
      p_location('insert_into_arc_act_plus - STOP_PROGRAM_YN flag = '||l_STOP_PROGRAM_YN||' so ROLLBACK'); 
      ROLLBACK; 
      EXIT; 
     END IF; 

     -- ************************************************** 
     -- Output how many records have been inserted here??? 
     -- ************************************************** 

     -- commit after every 10000 records into arc_act_plus_triggers1 
     COMMIT;  
     EXIT WHEN c_arc_act_plus_triggers1%NOTFOUND; 


    END LOOP; 
    CLOSE c_arc_act_plus_triggers1; 

END; 
+1

Вы пробовали 'SQL% ROWCOUNT'? https://docs.oracle.com/database/121/LNPLS/static.htm#LNPLS99956 –

+1

Предположительно, это будет 'v_arc_act_plus_triggers1.COUNT'? Предполагая, что исключений не существует и т. Д. – Boneist

+0

Исключение не происходит, так как это просто прямая копия из одной таблицы в таблицу архива, которая является копией. –

ответ

0

Я не проверил, как у меня нет ничего, чтобы проверить против поэтому, пожалуйста, простите любые «недостающие ошибки типа полу-двоеточие», и я боюсь, что я не в состоянии проверять выполнение этого.

Ваш код, кажется, выбирает, какие строки следует вставлять в таблицу архива, основываясь на отсутствии в архиве. Поэтому просто используйте INSERT на основе SELECT, ограниченного подходящим значением ROWNUM. После того, как вы зафиксируете в следующий раз цикл, он не попытается получить уже заархивированные строки, как только вы их совершили.

Я думаю, что это должно быть так быстро, если не быстрее, чем разборки вставок с тем преимуществом, что его более простая - Оксейкс Бритва и все такое.

DECLARE 
    l_commit_count NUMBER := 10000; 
    l_rows_copied NUMBER := 0; 
BEGIN 
    DBMS_OUTPUT.PUT_LINE('Started at '||TO_DATE(SYSDATE, 'DD_MON_YYY HH24:MI:SS'); 
    LOOP 
     INSERT /*+APPEND */ 
     INTO c_arc_act_plus_triggers1 
     SELECT /*+ PARALLEL */ apt.* 
      FROM act_plus_triggers1 apt 
      WHERE NOT EXISTS 
        (SELECT 1 
         FROM act_plus_triggers_copy1 aptc 
         WHERE aptc.surr_id = apt.surr_id) 
      AND apt.status IN ('EXT', 'EXP') 
      AND rownum < l_commit_count; 

     COMMIT;   
     l_rows := l_rows + SQL%ROWCOUNT; 
     EXIT WHEN SQL%ROWCOUNT < 1; 
    END LOOP   
    DBMS_OUTPUT.PUT_LINE('Finished at '||TO_DATE(SYSDATE, 'DD_MON_YYY HH24:MI:SS'); 
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(l_rows)||' rows copied to the archive table'); 
END; 
+0

Я попробую вышесказанное и вернусь к вам –

 Смежные вопросы

  • Нет связанных вопросов^_^