表函数可接受查询语句或游标作为输入参数,并可输出多行数据。该函数可以平行执行,并可持续输出数据流,被称作管道式输出。应用表函数可将数据转换分阶段处理,并省去中间结果的存储和缓冲表。 1. 用游标传递数据 利用游标 REF CURSOR 可将数据集(多行记录

表函数可接受查询语句或游标作为输入参数,并可输出多行数据。该函数可以平行执行,并可持续输出数据流,被称作管道式输出。应用表函数可将数据转换分阶段处理,并省去中间结果的存储和缓冲表。

1. 用游标传递数据利用游标 REF CURSOR 可将数据集(多行记录)传递到PL/SQL函数:

SELECT *

FROM TABLE (myfunction (CURSOR (SELECT *

FROM mytab)));

2. 利用两个实体化视图(或表)作为样板数据CREATE MATERIALIZED VIEW sum_sales_country_mv

BUILD IMMEDIATE

REFRESH COMPLETE

ENABLE QUERY REWRITE

AS

SELECT SUBSTR (s.calendar_month_desc, 1, 4) YEAR, c.country_id country,

SUM (sum_amount_sold) sum_amount_sold

FROM sum_sales_month_mv s, customers c

WHERE s.cust_id = c.cust_id

AND c.country_id IN (‘US’, ‘UK’, ‘FR’, ‘ES’, ‘JP’, ‘AU’)

GROUP BY SUBSTR (s.calendar_month_desc, 1, 4), c.country_id;

CREATE MATERIALIZED VIEW sum_es_gend_mv

BUILD DEFERRED

REFRESH FAST

ENABLE QUERY REWRITE

AS

SELECT SUBSTR (s.calendar_month_desc, 1, 4) YEAR,

s.calendar_month_desc cal_month, c.cust_gender,

SUM (sum_amount_sold) sum_amount_sold

FROM sum_sales_month_mv s, customer c

WHERE s.cust_id = c.cust_id

AND c.country_id = ‘ES’

AND sunstr (s.calendar_month_desc, 1, 4) = ‘2000’

GROUP BY SUBSTR (s.calendar_month_desc, 1, 4),

s.calendar_month_desc,

c.cust_gender;

3. 定义对象类型和基于对象类型的表类型定义对象类型并且为进一步引用做好准备。

(1)定义对象类型:TYPE sales_country_t

CREATE TYPE sales_country_t AS OBJECT (

YEAR VARCHAR2 (4),

country CHAR (2),

sum_amount_sold NUMBER

);(2)定义表类型:TYPE SUM_SALES_COUNTRY_T_TAB

CREATE TYPE sum_sales_country_t_tab AS TABLE OF sales_country_t;(3)定义对象类型:TYPE sales_gender_t

CREATE TYPE sales_gender_t AS OBJECT (

YEAR VARCHAR2 (4),

country_id CHAR (2),

cust_gender CHAR (1),

sum_amount_sold NUMBER

);(4)定义表类型:TYPE SUM_SALES_GENDER_T_TAB

CREATE TYPE sum_sales_gender_t_tab AS TABLE OF sales_gender_t;(5)定义对象类型:TYPE sales_roll_t

CREATE TYPE sales_roll_t AS OBJECT (

channel_desc VARCHAR2 (20),

country_id CHAR (2),

sum_amount_sold NUMBER

);(6)定义表类型:TYPE SUM_SALES_ROLL_T_TAB

CREATE TYPE sum_sales_roll_t_tab AS TABLE OF sales_roll_t;(7)检查一下建立的类型

SELECT object_name, object_type, status

FROM user_objects

WHERE object_type = ‘TYPE’;

4. 定义包:Create package and define REF CURSORCREATE OR REPLACE PACKAGE cursor_pkg

IS

TYPE sales_country_t_rec IS RECORD (

YEAR VARCHAR (4),

country CHAR (2),

sum_amount_sold NUMBER

);

TYPE sales_gender_t_rec IS RECORD (

YEAR VARCHAR2 (4),

country_id CHAR (2),

cust_gender CHAR (1),

sum_amount_sold NUMBER

);

TYPE sales_roll_t_rec IS RECORD (

channel_desc VARCHAR2 (20),

country_id CHAR (2),

sum_amount_sold NUMBER

);

TYPE sales_country_t_rectab IS TABLE OF sales_country_t_rec;

TYPE sales_roll_t_rectab IS TABLE OF sales_roll_t_rec;

TYPE strong_refcur_t IS REF CURSOR

RETURN sales_country_t_rec;

TYPE row_refcur_t IS REF CURSOR

RETURN sum_sales_country_mv%ROWTYPE;

TYPE roll_refcur_t IS REF CURSOR

RETURN sales_roll_t_rec;

TYPE refcur_t IS REF CURSOR;

END corsor_pkg;

5. 定义表函数

(1)定义表函数:FUNCTION Table_Ref_Cur_Week

CREATE OR REPLACE FUNCTION table_ref_cur_week (cur CURSOR.refcur_t)

RETURN sum_sales_country_t_tab

IS

YEAR VARCHAR (4);

country CHAR (2);

sum_amount_sold NUMBER;

objset sum_sales_country_t_tab := sum_sales_country_t_tab ();

i NUMBER := 0;

BEGIN

LOOP

— Fetch from cursor variable

FETCH cur

INTO YEAR, country, sum_amount_sold;

EXIT WHEN cur%NOTFOUND;

— exit when last row is fetched

— append to collection

i := i + 1;

objset.EXTEND;

objset (i) := sales_country_t (YEAR, country, sum_amount_sold);

END LOOP;

CLOSE cur;

RETURN objset;

END;/

(2)定义表函数:FUNCTION Table_Ref_Cur_Strong

CREATE OR REPLACE FUNCTION table_ref_cur_strong (cur cursor_pkg.strong_refcur_t)

RETURN sum_sales_country_t_tab PIPELINED

IS

YEAR VARCHAR (4);

country CHAR (2);

sum_amount_sold NUMBER;

i NUMBER := 0;

BEGIN

LOOP

FETCH cur

INTO YEAR, country, sum_amount_sold;

EXIT WHEN cur%NOTFOUND; — exit when last row fetched

PIPE ROW (sales_country_t (YEAR, country, sum_amount_sold));

END LOOP;

CLOSE cur;

RETURN;

END;/

(3)定义表函数:FUNCTION Table_Ref_Cur_row

CREATE OR REPLACE FUNCTION table_ref_cur_row (cur cursor_pkg.row_refcur_t)

RETURN sum_sales_country_t_tab PIPELINED

IS

in_rec cur%ROWTYPE;

out_rec sales_country_t := sales_country_t (NULL, NULL, NULL);

BEGIN

LOOP

FETCH cur

INTO in_rec;

EXIT WHEN cur%NOTFOUND; — exit when last row is fetched

out_rec.YEAR := in_rec.YEAR;

out_rec.country := in_rec.country;

out_rec.sum_amount_sold := in_rec.sum_amount_sold;

PIPE ROW (out_rec);

END LOOP;

CLOSE cur;

RETURN;

END;/

(4)定义表函数:FUNCTION Gender_Table_Ref_Cur_Week

CREATE OR REPLACE FUNCTION gender_table_ref_cur_week (cur cursor_pkg.refcur_t)

RETURN sum_sales_gender_t_tab

IS

YEAR VARCHAR2 (4);

country_id CHAR (2);

cust_gender CHAR (1);

sum_amount_sold NUMBER;

objset sum_sales_gender_t_tab := sum_sales_gender_t_tab ();

i NUMBER := 0;

BEGIN

LOOP

FETCH cur

INTO YEAR, country_id, cust_gender, sum_amount_sold;

EXIT WHEN cur%NOTFOUND; — exit when last row is fetched

i := i + 1;

objset.EXTEND;

objset (i) :=

sum_sales_gender_t (YEAR, country_id, cust_gender, sum_amount_sold);

END LOOP;

CLOSE cur;

RETURN objset;

END;/

6. 调用表函数

下列 SQL 查询语句调用已被定义的表函数。

SELECT *

FROM TABLE (table_ref_cur_week (CURSOR (SELECT *

FROM

sum_sales_country_mv)));

SELECT *

FROM TABLE (table_ref_cur_strong (CURSOR (SELECT *

FROM

sum_sales_country_mv)));

SELECT *

FROM TABLE (table_ref_cur_row (CURSOR (SELECT *

FROM

sum_sales_country_mv)));

SELECT *

FROM TABLE (table_ref_cur_week (CURSOR (SELECT *

FROM

sum_sales_country_mv

WHERE

country = ‘AU’)));

oracle 自带table,Oracle中table函数的使用详解相关推荐

  1. mysql中find_in_set_mysql中find_in_set()函数的使用详解

    首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文等等 . 现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储.那 ...

  2. java asynchronize_Java 中synchronize函数的实例详解

    Java 中synchronize函数的实例详解 java中的一个类的成员函数若用synchronized来修饰,则对应同一个对象,多个线程像调用这个对象的这个同步函数时必须等到上一个线程调用完才能由 ...

  3. python search用法,Python-re中search()函数的用法详解(查找ip)

    1.首先来看一下search()和find()的区别 import re s1 = "2221155" #search 字符串第一次出现的位置 print(re.search(&q ...

  4. python print函数用法_Python3.2中Print函数用法实例详解

    本文实例讲述了Python3.2中Print函数用法.分享给大家供大家参考.具体分析如下: 1. 输出字符串 >>> strHello = 'Hello World' >> ...

  5. C++中sprintf()函数的使用详解

    本篇文章是对C++中sprintf()函数的使用进行了详细的分析介绍,需要的朋友参考下 在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望.由于sprintf 跟printf ...

  6. PHP中spl_autoload_register()函数用法实例详解

    在了解这个函数之前先来看另一个函数:__autoload. 一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.c ...

  7. matlab中的count函数,Excel 中COUNT函数的使用详解,详情介绍

    COUNT在英文上是"统计"的意思,在数学上是"计数"的意思.下面,我们来看看Excel中COUNT函数怎么用吧. 操作方法 01 随便输入数字 在Excel中 ...

  8. opendir php 返回值,php中opendir函数的用法详解

    这篇文章主要介绍了php中opendir函数用法,以实例形式详细讲述了opendir函数打开目录的用法及相关的注意事项,具有一定的参考借鉴价值,需要的朋友可以参考下 本文实例分析了php中opendi ...

  9. python map用法_Python中 map()函数的用法详解

    python map()函数问题 使用map()函数生成一个值D但是检测D的长度时,只能测一次,一次之后D似不知道你的dataSet 是什么数据,是否是从数据库取出来的结果游标, 如果是的 那么dat ...

  10. python中where的用法_Python中where()函数的用法详解

    本文主要和大家介绍了详解Python中where()函数的用法,小编觉得挺不错的,现在分享给大家,也给大家做个参,希望能帮助到大家. where()的用法 首先强调一下,where()函数对于不同的输 ...

最新文章

  1. 编写里Linux命令解释器,linux基础教程试卷及答案
  2. oracle 9i 在安装到Oracle Database Configuration assistant....的时候
  3. nvr服务器系统,【64路IPC网络存储服务器(WNVR)】 - 太平洋安防网
  4. 如何关闭苹果手机自动扣费_教你关闭苹果手机系统的自动更新功能,旧手机还能再用几年!...
  5. Okhttp实用封装
  6. SpringMVC框架----SessionAttribute注解
  7. 推荐一个CSLab------英真时代(非广告,真心的)
  8. wsdl 架构验证警告:来自命名空间_Let it go: DARTS 神经网络可微架构搜索 笔记
  9. 解决引用微信公众号获取的图片不能正常显示的问题,显示改图片来自微信公众号
  10. 5G无线关键技术 — 新型传输波形技术和先进编码与调制技术
  11. 中国学生的最大噩梦,都来源于这个男人
  12. Allegro如何更改铜皮的网络操作指导
  13. wifi握手包自动跑包
  14. pdf照片显示正常打印时被翻转_注意!五省二级建造师考试准考证开始打印
  15. JQuery 动态设置setInterval定时器时间间隔
  16. Alibaba Code代码索引技术实践:为Code Review提供本地IDE的阅读体验
  17. 下载Gazebo模型
  18. BK06-部署蓝鲸智云社区版5.1-遇到的坑和解决方案
  19. 网狐荣耀需要什么服务器系统,网狐荣耀环境搭建教程
  20. win 7系统(64位)安装包

热门文章

  1. Redis分布式基础主从同步
  2. 概述嵌入式设备驱动,教你怎么“玩”转嵌入式开发
  3. MySQL数据库(六) 一一 基本操作之事物和索引
  4. Go -- php 中的pack(H*, $string) 转换成go
  5. Android学习笔记(二)基础知识(1)
  6. EditText,TextView显示图片,超链接,颜色等
  7. Asp.Net防止刷新重复提交数据的办法
  8. mysql 脏数据查询_MySQL数据库02
  9. python线程安全的单例_详解python实现线程安全的单例模式
  10. 信息学奥赛一本通 1144:单词翻转 | OpenJudge NOI 1.7 27