写点什么

Oracle table() 函数的合理运用,提高工作效率

用户头像
xiezhr
关注
发布于: 2021 年 03 月 06 日
Oracle table()函数的合理运用,提高工作效率

一、序言


前段时间一直在弄报表,快被这些报表整吐了,然后接触到了 Oracle 的 table()函数。所以今天把 table()函数的具体用法整理下,防止下次遇到忘记了。。


利用 table()函数,可接收输入参数,然后将 pl/sql 返回的结果集代替 table。由于表函数可将数据转换分阶段处理,并省去中间结果的存储和缓冲表,所以它的速度相对物理表要快很多,当然比直接查视图更是快不少。


二、table()函数使用步骤


  1. 定义对象类型


  • 对象类型定义:封装了数据结构和用于操纵这些数据结构的过程和函数。由对象类型头、对象类型体组成


  • 对象类型头:用于定义对象的公用属性和方法;


①属性:最少要包含一个属性,最多包含 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是方法的名称;
复制代码


  • 对象类型体:用于实现对象类型头所定义的公用方法。


① 方法类型


|方法|作用|说明|

|--|--|--|

|构造方法|用于初始化对象并返回对象实例|与对象类型同名的函数,默认的构造方法参数是对象类型的所有属性。(9i 前只能使用系统默认的构造方法、9i 后可自定义构造函数,自定义必须使用 constructor function 关键字)|

|member 方法|用于访问对象实例的数据|当使用 member 方法时,可以使用内置参数 self 访问当前对象实例。当定义 member 方法时,无论是否定义 self 参数,它都会被作为第一个参数传递给 member 方法。但如果要定义参数 self,那么其类型必须要使用当前对象类型。member 方法只能由对象实例调用,而不能由对象类型调用。|

|static 方法|用于访问对象类型|可以在对象类型上执行全局操作,而不需要访问特定对象实例的数据,因此 static 方法引用 self 参数。static 方法只能由对象类型调用,不能由对象实例调用(和 member 相反)|

|map 方法|可以在对多个对象实例之间排序;将对象实例映射成标量数值来比较|可以定义 map 方法,但只能有一个,与 order 互斥|

|order 方法|只能比较 2 个实例的大小|定义对象类型时最多只能定义一个 order 方法,而且 map 和 order 方法不能同时定义|

② 语法


create or replace type body type_name as    member | static method1 body;    member | static method1 body;...-- type_name是对象类型的名称;-- method是方法的名称;-- member | static 见上表格
复制代码


  1. 基于对象类型的表类型


语法


create or replace type table_name as table of type_name;--table_name 表类型名称--type_name 对象类型名称
复制代码


  1. 定义表函数


语法


create or replace function function_name ([p1,p2...pn]) return table_nameasv_test table_name := table_name();begin...end loop;return v_test;end function_name;-- function_name 函数名称-- p1,p2...pn 函数入参-- table_name 表函数名称
复制代码


  1. 调用表函数


语法:


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_tableasv_test t_test_table := t_test_table();beginfor i in 1 .. nvl(n,100) loopv_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 PIPELINEDasv_test t_test_table := t_test_table();beginfor i in 1 .. nvl(n,100) looppipe 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);
复制代码


大概就这么几个,如果后面有新的用法再补充。。


发布于: 2021 年 03 月 06 日阅读数: 13
用户头像

xiezhr

关注

把分享变成一种习惯,再小的帆也能远航 2021.03.01 加入

还未添加个人简介

评论

发布
暂无评论
Oracle table()函数的合理运用,提高工作效率