`
fspwp
  • 浏览: 48792 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

【转】Oracle中table函数的应用

 
阅读更多

表函数可接受查询语句或游标作为输入参数,并可输出多行数据。该函数可以平行执行,并可持续输出数据流,被称作管道式输出。应用表函数可将数据转换分阶段处理,并省去中间结果的存储和缓冲表。
  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 CURSOR
  
CREATE 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 * OM 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’)));

 

出自:http://edu.21cn.com/oracle/g_50_103015-5.htm

分享到:
评论

相关推荐

    Oracle中实现Split函数功能

    在实际应用中,Oracle 中实现 Split 函数功能可以用于各种数据处理场景,例如数据清洁、数据转换和数据分析等。例如,在数据清洁中,我们可以使用这个函数来拆分字符串,以便更好地处理和分析数据。在数据转换中,...

    postgresql 兼容 oracle 函数

    标题和描述中提到的“postgresql 兼容 oracle 函数”就是指在PostgreSQL中实现与Oracle类似的函数,以便于在两个系统间平滑过渡。 Oracle数据库拥有大量的内置函数,如日期处理、字符串操作、数学计算等,这些在...

    Oracle 中 table 函数的应用浅析

    Oracle中的Table函数是一种非常强大的工具,它允许开发者以更加灵活的方式处理数据,特别是在PL/SQL环境中。Table函数能够接收查询语句或者游标作为输入,然后返回多行数据,这样的特性使得它在数据处理和分析中具有...

    Oracle自定义聚合函数-分析函数

    Oracle 自定义聚合函数-分析函数 Oracle 自定义聚合函数是一种强大且灵活的功能,允许用户根据自己的需求创建自定义的聚合函数。聚合函数是一种特殊的函数,它可以对一组数据进行处理和计算,并返回一个结果。 ...

    Oracle函数返回表

    Oracle自定义函数返回一张表。主要用于生成一张等时间间隔的表数据。

    Oracle常用的和表(Table)相关的命令

    根据提供的文件信息,以下是从标题、描述以及部分代码示例中提炼出的关于Oracle数据库中与表(Table)操作相关的常用命令及其详细解释: ### 1. 创建表(Create Table) **命令格式**: ``` sql> create table table_...

    oracle nested table demo

    通过“Oracle Nested Table Demo”,我们可以学习如何创建、插入和查询嵌套表,以及理解其在实际应用中的优势。这个示例是理解和实践Oracle高级数据类型的一个好起点,对于希望深入了解Oracle数据库特性的开发者来说...

    oracle批量修改汉字转拼音首字母的函数

    总的来说,实现Oracle中批量修改汉字转拼音首字母的功能,需要对Oracle的内置函数有深入了解,并可能涉及到自定义PL/SQL函数的编写。这个过程可能涉及到字符编码、Unicode转换以及对多音字的处理,是一个涉及多方面...

    hibernate 调用oracle函数

    Oracle则作为一款强大的关系型数据库管理系统,广泛应用于企业级应用中。本文将深入探讨如何在Hibernate中调用Oracle的函数,以实现高效的数据操作。 首先,我们需要理解Hibernate的核心理念,它允许开发者通过面向...

    oracle权限函数

    ### Oracle权限函数详解 在Oracle数据库管理中,权限管理是一项重要的任务,它涉及到对用户、角色及对象等数据库实体的访问控制。通过合理地分配权限,可以有效地保护数据的安全性和完整性,同时确保业务流程的正常...

    oracle split函数

    在Oracle数据库中,并没有内置的split函数来处理字符串的分割操作。然而,在实际应用中,经常需要将一个包含多个值的字符串按照指定的分隔符进行拆分,转换为表格式的数据,以便进行进一步的处理或查询。为此,可以...

    oracle中sql函数小结

    本文将根据给定的内容对Oracle数据库中的一些重要SQL函数进行详细介绍。 #### 笛卡尔积 笛卡尔积是指两个表的所有记录进行交叉匹配,即每个表的第一条记录会与另一个表的所有记录进行组合,以此类推。在Oracle中,...

    oracle通过sql实现字符串转数字oracle函数

    本篇文章将深入探讨如何在SQL查询中利用Oracle提供的函数来实现这一目标。 首先,Oracle提供了一个内置函数`TO_NUMBER()`,它专门用于将字符串转换为数字。`TO_NUMBER(string, format_mask)`函数接收两个参数:要...

    Oracle拆分字符串,字符串分割的函数

    本篇文章将深入探讨Oracle中用于拆分字符串的函数,并通过具体的示例展示它们的用法。 1. **instr() 函数** `instr()` 是Oracle中的一个内建函数,它用于查找子串在目标字符串中的位置。例如,`instr(string, ...

    oracle+110个常用函数

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的SQL...以上这些函数在Oracle SQL中广泛应用于数据检索、清洗、分析等任务,对于数据库管理员和开发人员来说,熟练掌握这些函数能极大地提高工作效率。

    Oracle9i函数大全

    Oracle9i函数大全是一份详尽的文档,涵盖了在Oracle9i数据库中广泛使用的各种函数。这些函数在数据库管理和开发中扮演着至关重要的角色,帮助用户处理和操作数据。以下是一些关键函数的详细说明: 1. **ASCII()**:...

    oracle管道函数用法

    Oracle管道函数是一种特殊类型的函数,它能够返回一个数据集合,并且能够在函数执行的过程中逐步返回结果,而不仅仅是最后的结果。这种特性使得管道函数非常适合于处理大量数据或者需要逐步展示处理进度的场景。 ##...

    ORACLE中日期和时间函数汇总

    Oracle 中的日期和时间函数可以应用于各种场景,例如: * 计算两个日期之间的天数:`SELECT FLOOR(SYSDATE - TO_DATE('20020405', 'YYYYMMDD')) FROM DUAL;` * 查找某个日期是星期几:`SELECT TO_CHAR(TO_DATE('...

    oracle学习之函数存储过程

    函数在Oracle中主要用于执行特定的计算或逻辑处理,并返回一个结果。它们是数据库编程中的重要组成部分,可以提高代码的重用性和可维护性。 ##### 1.1 基本语法 ```sql CREATE OR REPLACE FUNCTION 函数名 (参数...

Global site tag (gtag.js) - Google Analytics