Oracle中的table()函数使用
作者:xiezhr 发布时间:2024-01-19 14:50:10
标签:Oracle,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是方法的名称;
对象类型体:用于实现对象类型头所定义的公用方法。
① 方法类型
方法 | 作用 | 说明 |
---|---|---|
构造方法 | 用于初始化对象并返回对象实例 | 与对象类型同名的函数,默认的构造方法参数是对象类型的所有属性。(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 见上表格
基于对象类型的表类型
语法
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);
来源:https://www.cnblogs.com/xiezhr/archive/2023/05/10/17343631.html
0
投稿
猜你喜欢
- Git 工作区、暂存区和版本库基本概念我们先来理解下Git 工作区、暂存区和版本库概念工作区:就是你在电脑里能看到的目录。暂存区:英文叫st
- 基础知识# 在Linux操作系统下,Python3的默认环境编码变为了utf-8编码,所以在编写代码的时候,字符串大部分都是以utf-8处理
- 在改进SQL Server 7.0系列所实现的安全机制的过程中,Microsoft建立了一种既灵活又强大的安全管理机制,它能够对用户访问SQ
- 比如说如果设置为例外,那么里面的.py文件就不会被IDE索引,所以语法提示也不会包括里面的内容sys.path.append('..
- 实验环境:tensorflow版本1.2.0,python2.7介绍惯例先展示函数:tf.nn.conv2d(input, filter,
- 我们先看一下JavaScript中关系运算符的类型转换规则:关系运算符(<、>、<=、>=) 试图将 express
- 1.颜色空间转换使用cv2.cvtColor(input_image ,flag),flag为转换类型常用的转换类型有:BGR和灰度图的转换
- 本文实例讲述了Python lxml模块的基本使用方法。分享给大家供大家参考,具体如下:1 lxml的安装安装方式:pip install
- COOKIE函数库:cookie.inc.php3 <?php if (!isset($__cookie_inc__)){ $__co
- 路漫漫其修远兮,吾将上下而求索,又到了周末,我继续带各位看官学习回顾Mysql知识。上次说到了流程控制函数,那就从流程控制函数来继续学习吧!
- 正则表达式在 PHP 中的应用在 PHP 应用中,正则表达式主要用于:•正则匹配:根据正则表达式匹配相应的内容•正则替换:根据正则表达式匹配
- SQL分页查询:背景在公司的系统中有一个平台是 做配置管理的 就是所谓的 CRUD 的平台,但是点击后进去到页面第一次看到的是一次查询的页面
- 今天下午在练习python时用了“if...if...else...”的分支结构,结果运行出来吓我一跳。原来我想当然的认为“if...if.
- 今天天气"刚刚好"(薛之谦么么哒),无聊的我翻到了一篇关于csv文件读取与写入的帖子,作为测试小白的我一直对python
- 网站上的Banner条,是网站用来作为盈利或者是发布一些重要的信息的工具。但是它又不能作为网页的主要内容,因为它的主要目的是吸引人的注意力,
- 先来看个实例#!/usr/bin/env python import sys def search2(a,m):
- 代码如下,U我认为对于新手来说最重要的是学会rnn读取数据的格式。# -*- coding: utf-8 -*-""&q
- 概述最近买了台服务器,准备搭建个人博客,来持续更新自己的博客,环境服务器操作系统:CentOS 7.0博客部署服务器:Apache后台语言:
- 本文实例讲述了Python实现读取文件最后n行的方法。分享给大家供大家参考,具体如下:# -*- coding:utf8-*-import
- 目录01 安装02 剪辑01 安装对视频进行批量剪辑,需要三个库,分别是Moviepy库和Pathlib库,还有Tkinter库。首先我们对