目录
- 一、序言
- 二、table()函数使用步骤
- 三、table() 具体使用实例
- 3.1 table()结合数组 使用
- 3.2 table()结合PIPELINED函数(这次报表使用的方式)
- 3.3 table()结合系统包使用
一、序言
前段时间一直在弄报表,快被这些报表整吐了,然后接触到了Oracle的table()函数。所以今天把table()函数的具体用法整理下,防止下次遇到忘记了。。
利用table()函数,可接收输入参数,然后将pl/sql 返回的结果集代替table。由于表函数可将数据转换分阶段处理,并省去中间结果的存储和缓冲表,所以它的速度相对物理表要快很多,当然比直接查视图更是快不少。
二、table()函数使用步骤
- 定义对象类型
-
对象类型定义:封装了数据结构和用于操纵这些数据结构的过程和函数。由对象类型头、对象类型体组成
-
对象类型头:用于定义对象的公用属性和方法;
①属性:最少要包含一个属性,最多包含1000个属性。定义时必须提供属性名和数据类型,但不能指定默认值和not null。并且不能包括long、long raw、rowid、urowid和PL/SQL特有类型(boolean%type%rowtype\\ref curdor等);
② 可以包含也可以不包含方法,可以定义构造方法、member方法、static方法、map方法和order方法。
③ 语法
create or replace type type_name as object (
v_name1 datatype [ ,v_name2 datatype,… ],
[ member | static method1 spec, member | static method2 spec , … ]
);
— type_name是对象类型的名称;
— v_name是属性名称;
— datatype是属性数据类型;
— method是方法的名称;
-
对象类型体:用于实现对象类型头所定义的公用方法。
① 方法类型
② 语法
create or replace type body type_name as
member | static method1 body;
member | static method1 body;…
— type_name是对象类型的名称;
— method是方法的名称;
— member | static 见上表格
- 基于对象类型的表类型
语法
create or replace type table_name as table of type_name;
–table_name 表类型名称
–type_name 对象类型名称
- 定义表函数
语法
create or replace function function_name ([p1,p2…pn]) return table_name
as
v_test table_name := table_name();
begin
…
end loop;
return v_test;
end function_name;
— function_name 函数名称
— p1,p2…pn 函数入参
— table_name 表函数名称
- 调用表函数
语法:
select * from table(function_name(20));
或者
select * from the(select function_name(20) from dual);
–function_name 定义好的表函数名称
三、table() 具体使用实例
公共部分对象类型和表类型创建
①对象类型创建
create or replace type t_test as object(
id integer,
rq date,
mc varchar2(60)
);
② 表类型创建
create or replace type t_test_table as table of t_test;
3.1 table()结合数组 使用
①创建表函数
create or replace function f_test_array(n in number default null) return t_test_table
as
v_test t_test_table := t_test_table();
begin
for i in 1 .. nvl(n,100) loop
v_test.extend();
v_test(v_test.count) := t_test(i,sysdate,\’mc\’||i);
end loop;
return v_test;
end f_test_array;
② 调用
select * from table(f_test_array(10));
或
select * from the(select f_test_array(10) from dual);
3.2 table()结合PIPELINED函数(这次报表使用的方式)
① 创建表函数
create or replace function f_test_pipe(n in number default null) return t_test_table PIPELINED
as
v_test t_test_table := t_test_table();
begin
for i in 1 .. nvl(n,100) loop
pipe row(t_test(i,sysdate,\’mc\’||i));
end loop;
return;
end f_test_pipe;
② 调用
select * from table(f_test_pipe(10));
或
select * from the(select f_test_pipe(10) from dual);
3.3 table()结合系统包使用
①创建测试
create table test (id varchar2(20),mc varchar2(20));
②表中插入数据
insert into test values(\’1\’,\’mc1\’);
commit;
③ 查看表执行计划
explain plan for select * from test;
④调用
select * from table(dbms_xplan.display);
到此这篇关于Oracle之table()函数的使用提高查询效率的文章就介绍到这了,更多相关Oracletable()函数内容请搜索悠久资源以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源!