Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Вторая версия, использует множественную обработку.*/
- CREATE OR REPLACE
- PROCEDURE report_sal_adjustment4_bulk IS
- f utl_file.file_type;
- CURSOR c_template IS
- SELECT e.empno, e.hiredate, e.sal, dept.dname,
- CASE WHEN sal > avg_sal THEN 'Y'
- ELSE 'N'
- END status
- FROM (
- SELECT empno, hiredate, sal, deptno,
- AVG(sal) over (PARTITION BY deptno) AS avg_sal,
- MIN(sal) over (PARTITION BY deptno) AS min_sal
- FROM emp) e, dept
- WHERE e.deptno = dept.deptno
- AND ABS(e.sal - e.avg_sal)/e.avg_sal > 0.10;
- /*Вот определение нового типа — набора (или массива) строк, каждая из которых будет содержать поля, соответствующие предыдущему определению курсора.*/
- TYPE resultset IS TABLE OF c_template%ROWTYPE;
- r resultset;
- BEGIN
- f := utl_file.fopen('REPORT_DIR', 'report.dat', 'W') ;
- OPEN c_template;
- /*Тут проявляется различие в обработке. Вместо обработки строк по одной в цикле мы можем выбрать все строки в результирующем множестве R*/
- FETCH c_template BULK COLLECT INTO r;
- CLOSE c_template;
- /*Теперь, когда переменная R содержит все результирующее множество, мы проходим в цикле по этому набору в памяти, а не обращаемся постоянно к базе данных для получения новых строк из курсора.*/
- FOR i IN 1..r.COUNT LOOP
- utl_file.put_line(f,r(i).empnol || r(i).hiredatel || r(i).sal || r(i).dnamel || r(i).status);
- END LOOP;
- utl_file.fclose(f);
- END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement