Advertisement
VoronVU

Вторая версия, использует множественную обработку.

Apr 2nd, 2015
1,175
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*Вторая версия, использует множественную обработку.*/
  2. CREATE OR REPLACE
  3. PROCEDURE report_sal_adjustment4_bulk IS
  4.   f utl_file.file_type;
  5.   CURSOR c_template IS
  6.     SELECT e.empno, e.hiredate, e.sal, dept.dname,
  7.     CASE WHEN sal > avg_sal THEN 'Y'
  8.     ELSE 'N'
  9.     END status
  10.   FROM (
  11.     SELECT empno, hiredate, sal, deptno,
  12.       AVG(sal) over (PARTITION BY deptno) AS avg_sal,
  13.       MIN(sal) over (PARTITION BY deptno) AS min_sal
  14.     FROM emp) e, dept
  15.   WHERE e.deptno = dept.deptno
  16.   AND ABS(e.sal - e.avg_sal)/e.avg_sal > 0.10;
  17. /*Вот определение нового типа — набора (или массива) строк, каждая из которых будет содержать поля, соответствующие предыдущему определению курсора.*/
  18.  
  19. TYPE resultset IS TABLE OF c_template%ROWTYPE;
  20.   r resultset;
  21. BEGIN
  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;
Advertisement
RAW Paste Data Copied
Advertisement