网格中的Oracle SQL输出选择结果

时间:2018-09-17 20:00:50

标签: sql oracle

我想知道是否可以提高类似以下查询的查询速度:

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

有更好的方法吗?最终将结果显示到gridview

谢谢!

1 个答案:

答案 0 :(得分:0)

如果必须使用外部循环,可以通过将行插入到(全局临时?)表中来避免内部循环;完成后,从该表中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不能很好地扩展。如果有很多数据,您甚至可能用完缓冲区。此外,您还必须等到在输出上绘制一切。此外,它也不灵活-您无法对其进行排序,对其应用过滤器...-对于您要进行的每个更改,都必须一次又一次地运行相同的查询。但是,如果所有内容都存储在表中,则您可以免费做事。