个人理解,table函数是把数组类型的变量展开显示出来
三种用法:
1 table()与返回值为数组的类型的普通函数一起使用
2 table()与返回值为数组类型的管道函数一起使用
3, table()与系统包中的管道函数一起使用 实际也就是2
以下代码为例子:
- --创建类型t_test
- SQL> create or replace type t_test as object (
- 2 id number,
- 3 time date,
- 4 data varchar2(60)
- 5 );
- 6 /
- Type created
- Executed in 0.063 seconds
- --创建以t_test类型的数组t_test_tb
- SQL> create or replace type t_test_tb as table of t_test;
- 2 /
- Type created
- Executed in 0.031 seconds
- --1 创建普通函数 返回数组类型,用数组的实例存放结果集(t_array),结果集全部处理完成后一起返回
- SQL> create or replace function f_test_array(n in number default null) return t_test_tb as
- 2 t_array t_test_tb := t_test_tb();
- 3 begin
- 4 for i in 1..nvl(n,100) loop
- 5 t_array.extend();
- 6 t_array(t_array.count) := t_test(i,sysdate,'mi'||i);
- 7 end loop;
- 8 return t_array;
- 9 end;
- 10 /
- Function created
- Executed in 0.046 seconds
- --直接select是不能显示的
- SQL> select f_test_array(10) from dual;
- F_TEST_ARRAY(10)
- ----------------
- <Object>
- Executed in 0.062 seconds
- --对于返回类型是数组的那么用table()函数或者the
- SQL> select * from table(f_test_array(10));
- ID TIME DATA
- ---------- ----------- ------------------------------------------------------------
- 1 2010-8-10 1 mi1
- 2 2010-8-10 1 mi2
- 3 2010-8-10 1 mi3
- 4 2010-8-10 1 mi4
- 5 2010-8-10 1 mi5
- 6 2010-8-10 1 mi6
- 7 2010-8-10 1 mi7
- 8 2010-8-10 1 mi8
- 9 2010-8-10 1 mi9
- 10 2010-8-10 1 mi10
- 10 rows selected
- Executed in 0.187 seconds
- SQL> select * from the(select f_test_array(10) from dual);
- ID TIME DATA
- ---------- ----------- ------------------------------------------------------------
- 1 2010-8-10 1 mi1
- 2 2010-8-10 1 mi2
- 3 2010-8-10 1 mi3
- 4 2010-8-10 1 mi4
- 5 2010-8-10 1 mi5
- 6 2010-8-10 1 mi6
- 7 2010-8-10 1 mi7
- 8 2010-8-10 1 mi8
- 9 2010-8-10 1 mi9
- 10 2010-8-10 1 mi10
- 10 rows selected
- Executed in 0.172 seconds
- --2 用返回类型为数组的管道函数,这里没用用到存放中间结果的变量,每处理完一条记录那么立刻返回结果
- SQL> create or replace function f_test_pipe(n in number default null) return t_test_tb pipelined
- 2 as
- 3 begin
- 4 for i in 1..nvl(n,100) loop
- 5 pipe row(t_test(i,sysdate,'mi'||i));
- 6 end loop;
- 7 return;
- 8 end;
- 9 /
- Function created
- Executed in 0.031 seconds
- SQL> select f_test_pipe(10) from dual;
- F_TEST_PIPE(10)
- ---------------
- <Object>
- Executed in 0.062 seconds
- SQL> select * from table(f_test_pipe(10));
- ID TIME DATA
- ---------- ----------- ------------------------------------------------------------
- 1 2010-8-10 1 mi1
- 2 2010-8-10 1 mi2
- 3 2010-8-10 1 mi3
- 4 2010-8-10 1 mi4
- 5 2010-8-10 1 mi5
- 6 2010-8-10 1 mi6
- 7 2010-8-10 1 mi7
- 8 2010-8-10 1 mi8
- 9 2010-8-10 1 mi9
- 10 2010-8-10 1 mi10
- 10 rows selected
- Executed in 0.156 seconds
- SQL> select * from the(select f_test_pipe(10) from dual);
- ID TIME DATA
- ---------- ----------- ------------------------------------------------------------
- 1 2010-8-10 1 mi1
- 2 2010-8-10 1 mi2
- 3 2010-8-10 1 mi3
- 4 2010-8-10 1 mi4
- 5 2010-8-10 1 mi5
- 6 2010-8-10 1 mi6
- 7 2010-8-10 1 mi7
- 8 2010-8-10 1 mi8
- 9 2010-8-10 1 mi9
- 10 2010-8-10 1 mi10
- 10 rows selected
- Executed in 0.172 seconds
- SQL> drop table test;
- Table dropped
- Executed in 0.047 seconds
- --3 table调用包中返回为数组类型的函数 dbms_xplan.display 是返回类型为数组的管道函数
- SQL> create table test(id number, name varchar2(30));
- Table created
- Executed in 0.047 seconds
- SQL> insert into test values(1,'d');
- 1 row inserted
- Executed in 0 seconds
- SQL> commit;
- Commit complete
- Executed in 0.016 seconds
- SQL> explain plan for select * from test;
- Explained
- Executed in 0 seconds
- SQL> select * from table(dbms_xplan.display);
- PLAN_TABLE_OUTPUT
- --------------------------------------------------------------------------------
- Plan hash value: 1357081020
- --------------------------------------------------------------------------
- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
- --------------------------------------------------------------------------
- | 0 | SELECT STATEMENT | | 1 | 30 | 3 (0)| 00:00:01 |
- | 1 | TABLE ACCESS FULL| TEST | 1 | 30 | 3 (0)| 00:00:01 |
- --------------------------------------------------------------------------
- Note
- -----
- - dynamic sampling used for this statement
- 12 rows selected
- Executed in 0.187 seconds