Oracle SQL выходной результат выбора в сетке - PullRequest
0 голосов
/ 17 сентября 2018

Хотелось бы узнать, могу ли я улучшить скорость обработки подобного запроса, подобного приведенному ниже:

Begin
    FOR r IN (
        select org_id ,name from op_units order by 1
    ) LOOP

        dbms_application_info.set_client_info (r.org_id);

        for x in (
            select PDI.PROJECT_NUMBER, ppv.description
            from PA_DRAFT_INVOICES_V PDI
            LEFT JOIN pa_projects_v ppv ON ppv.project_id = pdi.project_id
            WHERE PDI.CREATION_DATE > to_date('01/07/2018', 'DD-MM-YYYY')
        ) LOOP

        dbms_output.put_line(x.PROJECT_NUMBER||'~'||x.description);

        END LOOP;
    END LOOP;
end;

Приведенный выше запрос (но с несколькими объединениями и столбцами) занимает много времени. Я могу только представить, что это занимает столько времени из-за dbms_output.put_line

Есть ли лучший способ сделать это? В конце концов, чтобы отобразить результаты в виде сетки

Спасибо!

1 Ответ

0 голосов
/ 17 сентября 2018

Если вам нужно использовать внешний цикл, внутреннего можно избежать, вставляя строки в (глобальную временную?) Таблицу;как только это будет сделано, SELECT из этой таблицы.Примерно так:

begin
  for r in (select org_id , name from op_units) loop
    dbms_application_info.set_client_info (r.org_id);

    insert into temp_table (project_number, description)
      select pdi.project_number, ppv.description
      from pa_draft_invoices_v pdi
      left join pa_projects_v ppv on ppv.project_id = pdi.project_id
      where pdi.creation_date > to_date('01/07/2018', 'DD-MM-YYYY');
  end loop;
end;
/

Как только это будет сделано,

select * from temp_table;

я бы удалил ORDER BY в (внешнем) цикле;оно будет выполнено только 32 раза, но - какой смысл?

Использование DBMS_OUTPUT.PUT_LINE плохо масштабируется.Если данных много, вам может даже не хватить буфера.Также вам придется подождать, пока все не будет нарисовано на выходе.Кроме того, он не гибкий - вы не можете сортировать его, применять к нему фильтры, ... - для каждого изменения, которое вы хотите внести, вы должны запускать один и тот же запрос снова и снова.Но, если все хранится в таблице, вы гораздо больше бесплатно , чтобы делать вещи.

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