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; |