Oracle之table()函数的使用,提高查询效率

打印 上一主题 下一主题

主题 868|帖子 868|积分 2604

目录

一、序言

前段时间一直在弄报表,快被这些报表整吐了,然后接触到了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方法。
    ③ 语法
  1. create or replace type type_name as object (
  2.         v_name1 datatype [ ,v_name2 datatype,... ],
  3.         [ member | static method1 spec, member | static method2 spec , ... ]
  4. );
  5. -- type_name是对象类型的名称;
  6. -- v_name是属性名称;
  7. -- datatype是属性数据类型;
  8. -- 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方法不能同时定义② 语法
  1. create or replace type body type_name as
  2.     member | static method1 body;
  3.     member | static method1 body;...
  4. -- type_name是对象类型的名称;
  5. -- method是方法的名称;
  6. -- member | static 见上表格
复制代码

  • 基于对象类型的表类型
语法
  1. create or replace type table_name as table of type_name;
  2. --table_name 表类型名称
  3. --type_name 对象类型名称
复制代码

  • 定义表函数
语法
  1. create or replace function function_name ([p1,p2...pn]) return table_name
  2. as
  3. v_test table_name := table_name();
  4. begin
  5. ...
  6. end loop;
  7. return v_test;
  8. end function_name;
  9. -- function_name 函数名称
  10. -- p1,p2...pn 函数入参
  11. -- table_name 表函数名称
复制代码

  • 调用表函数
语法:
  1. select * from table(function_name(20));
  2. 或者
  3. select * from the(select function_name(20) from dual);
  4. --function_name 定义好的表函数名称
复制代码
三、table() 具体使用实例

公共部分对象类型和表类型创建
①对象类型创建
  1. create or replace type t_test as object(
  2. id integer,
  3. rq date,
  4. mc varchar2(60)
  5. );
复制代码
② 表类型创建
  1. create or replace type t_test_table as table of t_test;
复制代码
3.1 table()结合数组 使用

①创建表函数
  1. create or replace function f_test_array(n in number default null) return t_test_table
  2. as
  3. v_test t_test_table := t_test_table();
  4. begin
  5. for i in 1 .. nvl(n,100) loop
  6. v_test.extend();
  7. v_test(v_test.count) := t_test(i,sysdate,'mc'||i);
  8. end loop;
  9. return v_test;
  10. end f_test_array;
复制代码
② 调用
  1. select * from table(f_test_array(10));
  2. select * from the(select f_test_array(10) from dual);
复制代码
3.2 table()结合PIPELINED函数(这次报表使用的方式)

① 创建表函数
  1. create or replace function f_test_pipe(n in number default null) return t_test_table PIPELINED
  2. as
  3. v_test t_test_table := t_test_table();
  4. begin
  5. for i in 1 .. nvl(n,100) loop
  6. pipe row(t_test(i,sysdate,'mc'||i));
  7. end loop;
  8. return;
  9. end f_test_pipe;
复制代码
② 调用
  1. select * from table(f_test_pipe(10));
  2. select * from the(select f_test_pipe(10) from dual);
复制代码
3.3 table()结合系统包使用

①创建测试
  1. create table test (id varchar2(20),mc varchar2(20));
复制代码
②表中插入数据
  1. insert into test values('1','mc1');
  2. commit;
复制代码
③ 查看表执行计划
  1. explain plan for select * from test;
复制代码
④调用
  1. select * from table(dbms_xplan.display);
复制代码
大概就这么几个,如果后面有新的用法再补充。。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表