2017-01-30 2 views
1

У меня есть эта простая процедура оракула PLSQL:Предварительного порядок неотсортированного запроса курсора в оракуле

declare 
     cursor A is 
     select column_A 
     from A_TAB; -- no order by 
    begin 
     for rec_ in A loop 
     procedure_A(rec_.column_A); 
     end loop; 
    end; 

И это работает теперь для возрастов.

Когда я заглядываю в столбец sys.v_ $ sql_bind_capture, value_string, я могу видеть текущее значение связанного столбца_A, и, к счастью, это значение постоянно меняется каждые несколько минут.

Поскольку курсор не был отсортирован ничем, есть ли способ увидеть, сколько еще записей (пока это не закончится)? Другими словами, мне нужно будет увидеть текущие значения запроса из этого курсора. Где его искать?

Это база данных Oracle 12.

+2

Сколько строк в A_TAB? Что делает процедура_A? – BobC

ответ

3

Вы можете использовать dbms_application_info.set_session_longops для этого. Результаты видны в V $ SESSION_LONGOPS.

В вашем примере, что может сделать что-то вроде:

DECLARE 
    rindex BINARY_INTEGER; 
    slno  BINARY_INTEGER; 
    totalwork number; 
    sofar  number; 
    obj  BINARY_INTEGER; 

    cursor A is 
    select column_A, 
      COUNT(*) OVER() cnt 
    from A_TAB; -- no order by 
begin 
    rindex := dbms_application_info.set_session_longops_nohint; 
    sofar := 0; 
    for rec_ in A loop 
    totalwork := rec_.cnt; 
    sofar := sofar + 1; 
    dbms_application_info.set_session_longops(rindex, 
               slno, 
               'Process a_tab', 
               'A_TAB', 
               0, 
               sofar, 
               totalwork, 
               'table', 
               'rows'); 

    procedure_A(rec_.column_A); 
    end loop; 
end; 

Обратите внимание, что для того, чтобы получить значение totalwork, я использовал функцию аналитической COUNT(), чтобы получить общее количество строк в ResultSet. Вы можете запустить отдельный запрос, чтобы получить счетчик перед циклом через ваш исходный курсор, если это быстрее. Вам нужно будет проверить оба метода для разработки, которые будут наиболее быстрыми для ваших данных и т. Д.

Конечно, в зависимости от того, что делает процедура_a, вы можете избежать необходимости следить за прогрессом, если вы можете реорганизовать вещи так что вся работа выполняется в одном выражении SQL. Мой ответ выше предполагает, что это невозможно сделать. Если это так, я настоятельно рекомендую вам реорганизовать ваш код вместо этого!

+0

Я ищу, вероятно, способ отслеживать прогресс без изменения кода. Скорее, для просмотра словаря данных, если таковые имеются? У меня запущено множество сценариев обновления, и нет шаблона, какая часть этих скриптов будет иметь проблемы с производительностью (или просто работает надолго). Следовательно, TAB_A может иметь миллионы записей, хотя из моего реального живого примера оно имеет только 10 КБ. И процедура_A продолжает обновлять другие таблицы, хотя для простоты мы можем предположить, что она имеет только «1-часовую инструкцию». Поэтому я хочу знать, если не точный порядок, то сколько еще записей должно быть обработано. – user1863063

+0

Возможно, вам повезло, и у вас уже есть что-то в v $ session_longops, так как вы выполняете полное сканирование таблицы. В противном случае, вы не можете сделать это, это не связано с изменением кода. – Boneist

+0

@ user1863063 О, так что вы * не * хотите сделать этот процесс быстрее? – BobC