Оптимизировать PL SQL Курсор Oracle Apex - PullRequest
0 голосов
/ 18 июня 2020

Я составляю отчет HTML, встраивая html в PL SQL. Я сделал это с помощью двух курсоров и вложенных циклов, но хочу его оптимизировать. Мой Oracle отчет Apex генерирует этот вывод

ACCOUNTING - NEW YORK
King - President
Clark - Manager
Miller - Clerk
RESEARCH - DALLAS
Jones - Manager
Scott - Analyst
Ford - Analyst
Smith - Clerk
Adams - Clerk
SALES - CHICAGO
Blake - Manager
Allen - Salesman
Ward - Salesman
Martin - Salesman
Turner - Salesman
James - Clerk
OPERATIONS - BOSTON
No Employee

мой код

    declare
Cursor c_dept Is Select d.Deptno,d.Dname,d.Loc
      From  eba_demo_load_dept d;

   Cursor c_Emp(v_Deptno Number) Is Select e.Empno,e.Ename,e.Job
      From   eba_demo_load_emp e
      Where  e.Deptno = v_Deptno;
begin

 For i In c_Dept Loop

      Htp.p('<ul>');
      Htp.p('<h4>' || i.Dname ||' - '||i.loc||'</h4>');
      --
      For j In c_Emp(i.Deptno) Loop
        Htp.p('<li>' || initcap(j.Ename) || ' - ' ||initcap(j.job)||'</li>');       
      End Loop;
    Htp.p('</ul>');    
   End Loop;

  Htp.p('<p>No Employee </p>');

end;

Я хочу его оптимизировать. Можно ли добиться того же результата в одном l oop с внутренним соединением в курсорной переменной. Если да, пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Я бы сказал, что вложенные циклы курсора - в этом случае - делают то, что должны делать. Из-за разных тегов HTML я не думаю, что другие решения улучшили бы его; может быть, немного сложнее читать и понимать. В нынешнем виде совершенно ясно, что вы делаете и чего ожидаете в результате.

Однако есть ли какая-то конкретная причина , почему вы делаете это таким образом? Apex предлагает интерактивные и классические c отчеты, которые делают это легко за несколько кликов. Я предлагаю вам использовать один из них вместо вашего собственного кода.

0 голосов
/ 18 июня 2020

Вы можете использовать один курсор, объединив запросы следующим образом:

declare
Cursor c_dept Is 
Select d.Deptno,d.Dname,d.Loc,,
           Listagg('<li>' || initcap(j.Ename) || ' - ' ||initcap(j.job)||'</li>', chr(10))
             Within group (order by 1) as emps
      From eba_demo_load_dept d
      Join eba_demo_load_emp e
      On e.Deptno = d.Deptno
      Group by d.Deptno,d.Dname,d.Loc;

begin

 For i In c_Dept Loop

      Htp.p('<ul>');
      Htp.p('<h4>' || i.Dname ||' - '||i.loc||'</h4>');
      --

    Htp.p(i.emps);       

    Htp.p('</ul>');    
   End Loop;

  Htp.p('<p>No Employee </p>');

end;
...