a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 465|回复: 4

[考试辅导] Oracle中table函数的应用

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
表函数可接受查询语句或游标作为输入参数,并可输出多行数据。该函数可以平行执行,并可持续输出数据流,被称作管道式输出。应用表函数可将数据转换分阶段处理,并省去中间结果的存储和缓冲表。3 t+ b" T8 ]; P3 A
  1. 用游标传递数据5 g( V  Y$ n; v( N4 v
  利用游标 REF CURSOR 可将数据集(多行记录)传递到PL/SQL函数:
9 W; A6 p8 T/ H3 w* I8 G  SELECT *4 Z3 D7 c9 b/ s& V
  FROM TABLE (myfunction (CURSOR (SELECT *FROM mytab)));  
6 g& T0 g/ V/ |  2. 利用两个实体化视图(或表)作为样板数据; j/ b2 W- E, @* k4 W
  CREATE MATERIALIZED VIEW sum_sales_country_mv" g& `6 I  R* D* a7 t
  BUILD IMMEDIATE
* S4 R+ G$ _/ h+ n  x  REFRESH COMPLETE
6 ?! x) h( @6 J5 q; x# v5 M$ d  ENABLE QUERY REWRITE- B' j/ z; @: c" s( F8 ^( R
  AS2 k- Z3 e' j, l& h2 Q
  SELECT SUBSTR (s.calendar_month_desc, 1, 4) YEAR, c.country_id country,
, V) `  K; ^5 z" r7 q   SUM (sum_amount_sold) sum_amount_sold
/ t& ^7 W1 G( j& X. {  C" i   FROM sum_sales_month_mv s, customers c
5 @  C5 M/ ~, ?1 C  WHERE s.cust_id = c.cust_id
$ V8 Y- Q- f/ E4 D1 O9 j" M  AND c.country_id IN (’US’, ’UK’, ’FR’, ’ES’, ’JP’, ’AU’)9 {4 Q# g0 N# w: ^4 Y
  GROUP BY SUBSTR (s.calendar_month_desc, 1, 4), c.country_id;
  J3 ]; N: I6 M4 h$ Y" f  CREATE MATERIALIZED VIEW sum_es_gend_mv
! e. h0 Y0 Q$ w9 f# O+ N  BUILD DEFERRED
' e5 Y- y: _2 H5 g9 I3 _  REFRESH FAST' k: G" B, K, k' k" T6 D/ r
  ENABLE QUERY REWRITE+ ^; t" d  o$ H* ~/ P/ t' a: l
  AS( V# s. w0 o( m# \5 E
  SELECT SUBSTR (s.calendar_month_desc, 1, 4) YEAR,) @) h7 \2 P) T* I: X" q4 S
   s.calendar_month_desc cal_month, c.cust_gender,6 s6 s/ j( V9 _* B3 H$ p" W9 Y
   SUM (sum_amount_sold) sum_amount_sold6 X) P, N# T+ {
   FROM sum_sales_month_mv s, customer c
/ z+ V1 @1 a7 N3 ]3 c4 ?0 i  WHERE s.cust_id = c.cust_id' D/ y8 o( L6 r( ?
   AND c.country_id = ’ES’
9 |" P* n  W( k- ?+ S- w1 L' |4 r   AND sunstr (s.calendar_month_desc, 1, 4) = ’2000’
/ Z5 S6 l7 N+ t0 @6 ]  GROUP BY SUBSTR (s.calendar_month_desc, 1, 4),
) X" f: z+ A7 t" B' ~  F   s.calendar_month_desc,! k" }% p/ z! r- R
   c.cust_gender;
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle中table函数的应用

 3. 定义对象类型和基于对象类型的表类型# [8 x3 P9 v# }! m. w
  定义对象类型并且为进一步引用做好准备。
% n) R; L; M# f4 T  (1)定义对象类型:TYPE sales_country_t1 A( d2 g2 i6 y" u% E/ a! u' {
  CREATE TYPE sales_country_t AS OBJECT (" K! j" {. I1 R- t5 V
  YEAR VARCHAR2 (4),
! c( H+ l0 ]5 L; B5 K0 O  country CHAR (2),! h* k. Z/ \# l# B  m3 x2 R
  sum_amount_sold NUMBER+ Y: w0 `7 q3 ~: S3 y/ M  c
  );+ w6 z4 ?& Q3 _2 Y% _) L+ \
  (2)定义表类型:TYPE SUM_SALES_COUNTRY_T_TAB! J& h8 ]8 K( {2 I- N- x: N
  CREATE TYPE sum_sales_country_t_tab AS TABLE OF sales_country_t;, V4 Z0 f9 ?, L
  (3)定义对象类型:TYPE sales_gender_t
' D+ d1 i( B! {; ^4 R- {/ [  CREATE TYPE sales_gender_t AS OBJECT (
7 z1 Q" M0 O" B: J  YEAR VARCHAR2 (4),
# o/ _3 l4 c2 }4 ]  country_id CHAR (2),6 M9 l* T. y$ n8 p+ r3 w
  cust_gender CHAR (1),* O* g6 l# J. f5 O
  sum_amount_sold NUMBER0 b( r0 }, q" H: _9 `6 w
  );
8 y4 c* ^) e& j# k" R  (4)定义表类型:TYPE SUM_SALES_GENDER_T_TAB
0 M6 Q& s# ]. H" Q  CREATE TYPE sum_sales_gender_t_tab AS TABLE OF sales_gender_t;
0 V8 P% Z: z$ i* G; V& X$ [  (5)定义对象类型:TYPE sales_roll_t# `2 m2 c. u- F2 w: O
  CREATE TYPE sales_roll_t AS OBJECT (2 o7 b8 v( O* T9 W
  channel_desc VARCHAR2 (20),
" z# e6 _% h1 ^+ c' R% _8 L9 k! P7 u  country_id CHAR (2),: Z3 T$ |# `# z
  sum_amount_sold NUMBER8 T& G. _. d5 k) C5 |0 @
  );
5 V$ a  U$ Q$ Y1 e" o  ~( i  (6)定义表类型:TYPE SUM_SALES_ROLL_T_TAB
3 k) G" N8 H' O0 b$ }  CREATE TYPE sum_sales_roll_t_tab AS TABLE OF sales_roll_t;; w1 q' M0 O1 F, V% d
  (7)检查一下建立的类型* t2 a/ t2 [5 m5 A0 [( n
  SELECT object_name, object_type, status
; U) @* w4 u' }  FROM user_objects/ }. A% u9 @& n5 [1 c3 W( O9 q5 r. ^
  WHERE object_type = ’TYPE’;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:21 | 显示全部楼层

Oracle中table函数的应用

 4. 定义包:Create package and define REF CURSOR
! z3 S7 }( x+ {7 A+ {& i  CREATE OR REPLACE PACKAGE cursor_pkg; g3 _: G! |4 ?6 s
  IS) K. K& R( B) s  A# x4 K+ g
  TYPE sales_country_t_rec IS RECORD (
( X; c6 [% o( I  D: r" G  YEAR VARCHAR (4),
1 S; G7 M# Z7 a; B3 u  country CHAR (2),
- S  Z7 E; _3 l( @$ c; G, S  sum_amount_sold NUMBER
* C# x% c2 j) {3 ]& A( L% y  );
+ W1 K/ G/ m/ q/ r/ ?. j  TYPE sales_gender_t_rec IS RECORD (
' m& ]$ F0 ~! C" n% k% l$ I9 q  YEAR VARCHAR2 (4),
# v6 ]; }2 P( ]; e4 |; l  country_id CHAR (2),. S# C9 d7 J7 [
  cust_gender CHAR (1),9 D& D. O' S+ H
  sum_amount_sold NUMBER
7 {0 M  V, K0 x  );
2 }, W0 A/ \" U  TYPE sales_roll_t_rec IS RECORD (9 M1 {3 g/ t. s" o
  channel_desc VARCHAR2 (20),
" j( ?0 @# Q. k  country_id CHAR (2),, {: m/ i# H2 e; E
  sum_amount_sold NUMBER
  [6 c/ a- c" N) W8 d1 o. F  );9 v& _( \$ L& k! n. ?# E& `
  TYPE sales_country_t_rectab IS TABLE OF sales_country_t_rec;
' }/ _7 Y& }5 p4 m$ C( ^  \  TYPE sales_roll_t_rectab IS TABLE OF sales_roll_t_rec;! c$ n  G& X8 j: k9 m; u# Q' b$ ]% M
  TYPE strong_refcur_t IS REF CURSOR7 n2 \1 l; J' I9 G4 {: f* p; p
  RETURN sales_country_t_rec;
- Z% X3 w) y! p  O9 r4 C9 z; |  TYPE row_refcur_t IS REF CURSOR* F' H$ U2 q* ^
  RETURN sum_sales_country_mv%ROWTYPE;  }5 z) t' x, G: O: h" R
  TYPE roll_refcur_t IS REF CURSOR+ P5 m) M7 L0 Q/ n: Z
  RETURN sales_roll_t_rec;" a' ^. i+ n" t( s$ [0 f$ h
  TYPE refcur_t IS REF CURSOR;$ K: P" Q9 }% h) C0 `7 ~4 L7 E
  END corsor_pkg;
) k/ D+ O+ M3 T9 U& H
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:22 | 显示全部楼层

Oracle中table函数的应用

5. 定义表函数
! n/ Y: W" r6 z& L1 r3 @  (1)定义表函数:FUNCTION Table_Ref_Cur_Week+ `% x+ `' E7 d- s2 P" }. ~! y
  CREATE OR REPLACE FUNCTION table_ref_cur_week (cur CURSOR.refcur_t)
2 A  e, z  u# _( Y! j  RETURN sum_sales_country_t_tab) x7 w7 |3 ?1 k+ e' F
  IS
6 I* L  z' {$ H" o6 D  YEAR VARCHAR (4);
/ m! ^$ |4 L+ v, P( M. L$ j, R  country CHAR (2);$ |0 n: ?( X, I
  sum_amount_sold NUMBER;
* A, F+ _' ]' P3 b  X  objset sum_sales_country_t_tab := sum_sales_country_t_tab ();
8 d7 _$ c5 N& a# [+ B" `  i NUMBER := 0;
) ]. z3 C( j) m; }3 N2 N2 r/ Z  BEGIN3 p$ ~! z2 T% o9 f$ n: y
  LOOP! p# n( V8 a# A6 }- ^- L
  -- Fetch from cursor variable
$ z) E2 \. O  V! v. l# i! ?  FETCH cur
2 E) [8 R0 `' I   INTO YEAR, country, sum_amount_sold;
5 c  E; g3 u) L- y5 M0 o  {  EXIT WHEN cur%NOTFOUND;6 W) ?% C$ a& K/ X& K7 @  E" k
   -- exit when last row is fetched7 r% i$ N5 d3 U/ A
  -- append to collection. f6 V4 `/ u, k2 A9 F# s2 d: I
  i := i + 1;9 a0 _$ G. Q+ @
  objset.EXTEND;
3 n/ J% i' S$ o. x/ H, B  objset (i) := sales_country_t (YEAR, country, sum_amount_sold);
+ V2 J- E) y: _: E* o  END LOOP;" j+ w0 G) C) q* D# \
  CLOSE cur;# a2 [: x2 v: u* }
  RETURN objset;* }% u7 ]" J) B) ]2 i) u7 _
  END;9 G2 i8 ~6 R9 s" I/ l8 p
  /
: j: `8 B0 Q" D  (2)定义表函数:FUNCTION Table_Ref_Cur_Strong, d7 d: X" n' u8 f; Y  l' {# K
  CREATE OR REPLACE FUNCTION table_ref_cur_strong (cur cursor_pkg.strong_refcur_t)8 Z) t& C8 [. b4 C
  RETURN sum_sales_country_t_tab PIPELINED
% ]) o$ o' J3 c( C0 s  S  IS
  y# i& t. m9 L: U8 J' x7 U5 p5 \9 ~; J  YEAR VARCHAR (4);
+ w1 b3 R0 q7 w  X5 I" v2 j  country CHAR (2);$ B. k9 L( v( l/ d" q, ^
  sum_amount_sold NUMBER;: R( s' ]! t" Q, \0 ^2 B
  i NUMBER := 0;2 u- |% r- _: D$ g* \
  BEGIN
, Y4 q2 f0 u  r! A" e. V% g/ b  LOOP
* [( M; n( p/ n/ d6 l6 ]5 o  FETCH cur
5 [& Q; J( }$ R) a7 M6 T- r   INTO YEAR, country, sum_amount_sold;
) Y; J, t  Q2 \2 o% g  EXIT WHEN cur%NOTFOUND; -- exit when last row fetched
" y3 ?+ N% a9 H2 e  PIPE ROW (sales_country_t (YEAR, country, sum_amount_sold));
9 ^3 @7 Y9 Y. o( P8 P  END LOOP;+ P3 O  _) N# q  n' Z
  CLOSE cur;
' X$ V; j5 n- _/ [0 r6 Q, N5 u, q  RETURN;/ M, ~9 L3 [  }# Q' g' l
  END;  U8 j  c! h( B1 z; O% f
  /
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:23 | 显示全部楼层

Oracle中table函数的应用

(3)定义表函数:FUNCTION Table_Ref_Cur_row/ M# d8 S8 [7 ?  Y( G
  CREATE OR REPLACE FUNCTION table_ref_cur_row (cur cursor_pkg.row_refcur_t)2 {2 g$ v% t, v1 A0 ^2 J! c( w
  RETURN sum_sales_country_t_tab PIPELINED
6 p& p/ r, e) y1 B& f  IS
0 t# Z) K* A% {- j+ O& z  in_rec cur%ROWTYPE;; G. t9 b: L8 p* o
  out_rec sales_country_t := sales_country_t (NULL, NULL, NULL);( @# X/ g* X( c* k0 X! W2 r7 E
  BEGIN
8 v$ z( O( b; }/ P5 e9 z2 ~; y- o  LOOP2 t5 @( {3 l4 Y! `3 z/ S1 Z. e% A
  FETCH cur5 L2 y' v% B8 ~: G
   INTO in_rec;
/ u4 {5 d" P# S6 G, @2 U  EXIT WHEN cur%NOTFOUND; -- exit when last row is fetched
. A( G2 k$ k8 N+ }4 c4 L  out_rec.YEAR := in_rec.YEAR;3 U% X- h& N9 ?' e' R  W8 u% h
  out_rec.country := in_rec.country;* T6 x' b, H2 F! {9 u0 g
  out_rec.sum_amount_sold := in_rec.sum_amount_sold;7 t8 T3 E8 N6 L! `& \5 A& l
  PIPE ROW (out_rec);
4 l4 p6 C4 d3 n" k0 h  END LOOP;
- b0 |. |, ]+ o$ ]  CLOSE cur;2 I$ K# d7 a9 p' C, Q
  RETURN;
, J7 C/ t' \- s, q! }  END;
# f& X0 J4 S6 o5 a$ ~6 V  /
& x+ m- R& m% g2 t" U  (4)定义表函数:FUNCTION Gender_Table_Ref_Cur_Week
( e+ ]: Y! x. f" _  CREATE OR REPLACE FUNCTION gender_table_ref_cur_week (cur cursor_pkg.refcur_t)
4 C% p, |5 h$ o: R  RETURN sum_sales_gender_t_tab
6 B( y% t7 c9 ]- ~" l0 z  IS
' {6 V+ ]9 f1 C, N$ A! x$ c) J! @  YEAR VARCHAR2 (4);  M. B& N$ a: x/ Z7 X7 X
  country_id CHAR (2);
) @# l& \* e0 i9 [6 [  cust_gender CHAR (1);
* _" F* c  f5 c6 R1 F8 P1 h  sum_amount_sold NUMBER;
" {1 @; i& |1 j  objset sum_sales_gender_t_tab := sum_sales_gender_t_tab ();
) I5 m6 F: X+ ~( @, R  i NUMBER := 0;
! x! [5 Z% n. S* v8 n  BEGIN
5 m1 K8 F9 C# B  LOOP
1 B: v# h$ d) R; \  FETCH cur
' k4 ?2 U- W- B) y: L% B7 }( W   INTO YEAR, country_id, cust_gender, sum_amount_sold;# E0 P0 Z3 ?, r9 E  B
  EXIT WHEN cur%NOTFOUND; -- exit when last row is fetched3 r5 A4 ~. o' S8 V
  i := i + 1;6 M! j# H! l* f( [* G! Q/ g
  objset.EXTEND;. a3 x6 z+ j$ q3 z0 t
  objset (i) :=! B" l' J% D3 T1 S' p* h
   sum_sales_gender_t (YEAR, country_id, cust_gender, sum_amount_sold);5 s: }' G( d+ c
  END LOOP;! A' A5 M! g7 C
  CLOSE cur;
; l+ h8 B# C7 Y4 P! V1 T; n  RETURN objset;, Q0 z- t/ G; v# V4 |
  END;% u# o5 Y3 g5 [" g9 U
  /
7 z% Q* K2 Y4 k% `1 {- y6 ]  6. 调用表函数
- I! X- E+ ^) \7 K1 Y6 ?  下列 SQL 查询语句调用已被定义的表函数。  A1 B+ C, M- A* j
  SELECT *FROM TABLE (table_ref_cur_week (CURSOR (SELECT * OM sum_sales_country_mv)));
+ \" y6 _5 R/ `  |  SELECT *FROM TABLE (table_ref_cur_strong (CURSOR (SELECT * FROM sum_sales_country_mv)));
5 X0 G- S- X9 v$ M) m: a: g  SELECT *FROM TABLE (table_ref_cur_row (CURSOR (SELECT * FROM sum_sales_country_mv)));& L; d4 I! C& r# q1 Q& ^
  SELECT *FROM TABLE (table_ref_cur_week (CURSOR (SELECT * FROM sum_sales_country_mv WHERE country = ’AU’)));
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-21 13:41 , Processed in 0.273240 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表