服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Oracle - Oracle中的table()函数使用

Oracle中的table()函数使用

2023-05-12 15:03xiezhr Oracle

这篇文章主要介绍了Oracle中的table()函数的使用,提高查询效率,利用table()函数,可接收输入参数,然后将pl/sql 返回的结果集代替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方法。

    ③ 语法

?
1
2
3
4
5
6
7
8
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方法不能同时定义

② 语法

?
1
2
3
4
5
6
create or replace type body type_name as
    member | static method1 body;
    member | static method1 body;...
-- type_name是对象类型的名称;
-- method是方法的名称;
-- member | static 见上表格
  • 基于对象类型的表类型

语法

?
1
2
3
create or replace type table_name as table of type_name;
--table_name 表类型名称
--type_name 对象类型名称
  • 定义表函数

语法

?
1
2
3
4
5
6
7
8
9
10
11
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 表函数名称
  • 调用表函数

语法:

?
1
2
3
4
select * from table(function_name(20));
或者
select * from the(select function_name(20) from dual);
--function_name 定义好的表函数名称

三、table() 具体使用实例

公共部分对象类型和表类型创建

①对象类型创建

?
1
2
3
4
5
create or replace type t_test as object(
id integer,
rq date,
mc varchar2(60)
);

② 表类型创建

?
1
create or replace type t_test_table as table of t_test;

3.1 table()结合数组 使用

①创建表函数

?
1
2
3
4
5
6
7
8
9
10
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;

② 调用

?
1
2
3
select * from table(f_test_array(10));
select * from the(select f_test_array(10) from dual);

3.2 table()结合PIPELINED函数(这次报表使用的方式)

① 创建表函数

?
1
2
3
4
5
6
7
8
9
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;

② 调用

?
1
2
3
select * from table(f_test_pipe(10));
select * from the(select f_test_pipe(10) from dual);

3.3 table()结合系统包使用

①创建测试

?
1
create table test (id varchar2(20),mc varchar2(20));

②表中插入数据

?
1
2
insert into test values('1','mc1');
commit;

③ 查看表执行计划

?
1
explain plan for select * from test;

④调用

?
1
select * from table(dbms_xplan.display);

到此这篇关于Oracle之table()函数的使用提高查询效率的文章就介绍到这了,更多相关Oracle table()函数内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/xiezhr/archive/2023/05/10/17343631.html

延伸 · 阅读

精彩推荐
  • OracleORACLE 回收站当前状态查询整理

    ORACLE 回收站当前状态查询整理

    回收站(Recycle Bin)从原理上来说就是一个数据字典表,放置用户删除(drop)掉的数据库对象信息,接下来详细介绍下ORACLE 回收站方方面面感兴趣的你可以参考...

    ORACLE教程网5682019-11-20
  • Oracleoracle 临时表详解及实例

    oracle 临时表详解及实例

    这篇文章主要介绍了oracle 临时表详解及实例的相关资料,需要的朋友可以参考下 ...

    lqh4692019-12-31
  • OracleOracle定义联合数组及使用技巧

    Oracle定义联合数组及使用技巧

    联合数组以前被称为PL/SQL表。在表中不能使用联合数组,只能将它们用作程序设计的结构体。只能在PL/SQL中访问联合数组 ...

    Oracle教程网2662019-11-13
  • OracleOracle 11g下编译使用BBED的方法教程

    Oracle 11g下编译使用BBED的方法教程

    这篇文章主要给大家介绍了在Oracle 11g下编译使用BBED的方法教程,文中详细介绍了关于拷贝缺失文件、编译BBED以及BBED使用测试的相关资料,通过示例代码介...

    AlfredZhao1892020-01-20
  • OracleOracle中dblink的实际应用示例详解

    Oracle中dblink的实际应用示例详解

    DBLink的作用是在局域网内,通过一台服务器上面的数据库访问另外一台服务器上面数据库的功能。下面这篇文章主要给大家介绍了关于Oracle中dblink实际应用...

    daisy4562020-03-11
  • OracleMaven中央仓库正式成为Oracle官方JDBC驱动程序组件分发中心(推荐)

    Maven中央仓库正式成为Oracle官方JDBC驱动程序组件分发中心(推荐

    这篇文章主要介绍了Maven中央仓库正式成为Oracle官方JDBC驱动程序组件分发中心,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,...

    码农小胖哥4372020-07-20
  • Oraclenavicat导入oracle导出的dmp文件

    navicat导入oracle导出的dmp文件

    现在工作中常用Oracle数据库,但是查询工具还是Navicat最好用,不论是数据导入导出,还是执行语句,都很清晰明了,下面这篇文章主要给大家介绍了关于navicat导入...

    机智の小盆友5042023-05-12
  • OracleOracle数据库对象的使用详解

    Oracle数据库对象的使用详解

    这篇文章主要介绍了Oracle数据库对象的使用,文章中涉及到的命令希望大家认真学习,对大家今后的工作或学习具有一定的参考借鉴价值,需要的朋友可以参...

    旷世奇才李先生3602022-07-28