View difference between Paste ID: G3FKtiXx and ypW8dG5c
SHOW: | | - or go back to the newest paste.
1-
--Построчная выдача отчета в файл
1+
/*Вторая версия, использует множественную обработку.*/
2
create or replace
3-
procedure report_sal_adjustment4 is
3+
procedure report_sal_adjustment4_bulk is
4
  f utl_file.file_type;
5
  cursor c_template is
6-
  f := utl_file.fopen ('REPORT_DIR', 'report.dat', 'W') ;
6+
    select e.empno, e.hiredate, e.sal, dept.dname,
7-
  for i in (
7+
    case when sal > avg_sal then 'Y'
8-
   select e.empno, e.hiredate, e.sal, dept.dname,
8+
    else 'N'
9-
   case when sal > avg_sal then 'Y' else 'N'
9+
    end status
10-
   end status
10+
11
    select empno, hiredate, sal, deptno,
12-
   select empno, hiredate, sal, deptno,
12+
      avg(sal) over (partition by deptno) as avg_sal,
13-
          avg(sal) over ( partition by deptno ) as avg_sal,
13+
      min(sal) over (partition by deptno) as min_sal
14-
          min(sal) over ( partition by deptno ) as min_sal
14+
    from emp) e, dept
15-
   from emp ) e, dept
15+
16
  and abs(e.sal - e.avg_sal)/e.avg_sal > 0.10;
17-
    and abs(e.sal - e.avg_sal)/e.avg_sal > 0.10 ) 
17+
/*Вот определение нового типа — набора (или массива) строк, каждая из которых будет содержать поля, соответствующие предыдущему определению курсора.*/
18-
loop
18+
19-
  utl_file.put_line(f, i.empnol || i.hiredate || i.sal || i.dname || i.status);
19+
type resultset is table of c_template%rowtype;
20
  r resultset;
21-
  utl_file.fclose(f);
21+
22
  f := utl_file.fopen('REPORT_DIR', 'report.dat', 'W') ;
23
  open c_template;
24
25
/*Тут проявляется различие в обработке. Вместо обработки строк по одной в цикле мы можем выбрать все строки в результирующем множестве R*/
26
27
fetch c_template bulk collect into r; 
28
close c_template;
29
30
/*Теперь, когда переменная R содержит все результирующее множество, мы проходим в цикле по этому набору в памяти, а не обращаемся постоянно к базе данных для получения новых строк из курсора.*/
31
32
for i in 1..r.count loop
33
  utl_file.put_line(f,r(i).empnol || r(i).hiredatel || r(i).sal || r(i).dnamel || r(i).status);
34
end loop;
35
utl_file.fclose(f);
36
end;