Oracle
SQL

Запрос из функции 2

Опубликовано: 10 окт 05
Рейтинг:

Автор: Denis Popov
Прислал:

Oracle 9.2.0.6

create or replace package pkg_test as
  
type tbl_number is table of number;

type t_emp is record (
    empno number(4)
  , ename varchar2(10)
  , job varchar2(9)
  , mgr number(4)
  , hiredate date
  , sal number(7,2)
  , comm number(7,2)
  , deptno number(2)
);
type tbl_emp is table of t_emp;

function pivot (
    p_start_row number
  , p_end_row number
) return tbl_number parallel_enable pipelined;

function get_emp return tbl_emp parallel_enable pipelined;

end;
/

create or replace package body pkg_test as

function pivot (
    p_start_row number
  , p_end_row number
) return tbl_number
parallel_enable pipelined is
begin
  for i in p_start_row..p_end_row loop
    pipe row(i);
  end loop;
  return;
end;

function get_emp return tbl_emp parallel_enable pipelined is
begin    
  for i in (select e.* from scott.emp e) loop
    pipe row (i);
  end loop;
  return;
end;    

end;
/

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production

SQL> select * from table(pkg_test.pivot(5, 10));

COLUMN_VALUE
------------
           5
           6
           7
           8
           9
          10

6 rows selected.

SQL> select * from table (pkg_test.get_emp);

     EMPNO ENAME                          JOB                                MGR HIREDATE                   SAL       COMM
---------- ------------------------------ --------------------------- ---------- -------------------
      7369 SMITH                          CLERK                             7902 17.12.1980 00:00:00        800                 
      7499 ALLEN                          SALESMAN                          7698 20.02.1981 00:00:00       1600        300
      7521 WARD                           SALESMAN                          7698 22.02.1981 00:00:00       1250        500
      7566 JONES                          MANAGER                           7839 02.04.1981 00:00:00       2975                 
      7654 MARTIN                         SALESMAN                          7698 28.09.1981 00:00:00       1250       1400
      7698 BLAKE                          MANAGER                           7839 01.05.1981 00:00:00       2850                 
      7782 CLARK                          MANAGER                           7839 09.06.1981 00:00:00       2450                 
      7788 SCOTT                          ANALYST                           7566 19.04.1987 00:00:00       3000                 
      7839 KING                           PRESIDENT                              17.11.1981 00:00:00       5000                 
      7844 TURNER                         SALESMAN                          7698 08.09.1981 00:00:00       1500          0
      7876 ADAMS                          CLERK                             7788 23.05.1987 00:00:00       1100                 
      7900 JAMES                          CLERK                             7698 03.12.1981 00:00:00        950                 
      7902 FORD                           ANALYST                           7566 03.12.1981 00:00:00       3000                 
      7934 MILLER                         CLERK                             7782 23.01.1982 00:00:00       1300                 

14 rows selected.

Для версии Oracle 10.2 (для 10.1 не проверял ввиду ее отсутствия) определение pl/sql-таблицы в спецификации пакета можно заменить на следующее:

--type t_emp is record (
--    empno number(4)
--  , ename varchar2(10)
--  , job varchar2(9)
--  , mgr number(4)
--  , hiredate date
--  , sal number(7,2)
--  , comm number(7,2)
--  , deptno number(2)
--);
--type tbl_emp is table of t_emp;
type tbl_emp is table of scott.emp%rowtype;

В Oracle 9i подобное приводит к исключению:

ORA-06552: PL/SQL: Compilation unit analysis terminated
ORA-06553: PLS-707: unsupported construct or internal error [2604]

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии

Раздел FAQ: Oracle / SQL / Запрос из функции 2