姿姿霸霸~~!
          貴在堅持!
          posts - 106,  comments - 50,  trackbacks - 0

                  TABLE函數(shù)可接受查詢語句或游標(biāo)作為輸入?yún)?shù),并可輸出多行數(shù)據(jù)。該函數(shù)可以平行執(zhí)行,并可持續(xù)輸出數(shù)據(jù)流,被稱作管道式輸出。應(yīng)用TABLE函數(shù)可將數(shù)據(jù)轉(zhuǎn)換分階段處理,并省去中間結(jié)果的存儲和緩沖表.
                  TABLE函數(shù)(它是9i中的新特性),實(shí)際上是將一個存儲在內(nèi)存中的對象(以流的方式存儲的)結(jié)構(gòu)化以后,使這個對象能以表的方式查詢。他對流對象的結(jié)構(gòu)化轉(zhuǎn)換就決定的它的效率大大遜于對普通表和臨時表的查詢效率.
                  TABLE函數(shù)可接受查詢語句或游標(biāo)作為輸入?yún)?shù),并可輸出多行數(shù)據(jù)。該函數(shù)可以平行執(zhí)行,并可持續(xù)輸出數(shù)據(jù)流,被稱

          1. 用游標(biāo)傳遞數(shù)據(jù)
          利用游標(biāo) REF CURSOR 可將數(shù)據(jù)集(多行記錄)傳遞到PL/SQL函數(shù):

          1SELECT *
          2  FROM TABLE (myfunction (CURSOR (SELECT *
          3                                    FROM mytab)));

          2.利用兩個實(shí)體化視圖(或表)作為樣板數(shù)據(jù)
          CREATE MATERIALIZED VIEW sum_sales_country_mv
          BUILD IMMEDIATE
          REFRESH COMPLETE
          ENABLE QUERY REWRITE
          AS
          SELECT   SUBSTR (s.calendar_month_desc, 14YEAR, 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, 14), c.country_id;

          CREATE MATERIALIZED VIEW sum_es_gend_mv
          BUILD DEFERRED
          REFRESH FAST
          ENABLE QUERY REWRITE
          AS
          SELECT   SUBSTR (s.calendar_month_desc, 14YEAR,
                   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, 14= '2000'
          GROUP BY SUBSTR (s.calendar_month_desc, 14),
                   s.calendar_month_desc,
                   c.cust_gender;

          3.定義對象類型和基于對象類型的表類型
          定義對象類型并且為進(jìn)一步引用做好準(zhǔn)備
          (1)定義對象類型:
          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. 定義表函數(shù)
          (1)定義表函數(shù):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)定義表函數(shù):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)定義表函數(shù):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 (NULLNULLNULL);
          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)定義表函數(shù):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. 調(diào)用表函數(shù)
          下列 SQL 查詢語句調(diào)用已被定義的表函數(shù)。

          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')));


           

          posted on 2010-12-19 22:53 xrzp 閱讀(1688) 評論(1)  編輯  收藏 所屬分類: oracle-基礎(chǔ)

          FeedBack:
          # re: 什么是table函數(shù)(收集)
          2012-11-29 10:57 | Jcat
          也就是說,我好不容易達(dá)到了你2年前的水平  回復(fù)  更多評論
            

          <2012年11月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          好友的blog

          搜索

          •  

          積分與排名

          • 積分 - 117748
          • 排名 - 499

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 台湾省| 安义县| 修文县| 白河县| 醴陵市| 东平县| 沭阳县| 永昌县| 定南县| 阿拉善左旗| 南和县| 景东| 大城县| 新营市| 扬州市| 原阳县| 桦川县| 扎赉特旗| 兖州市| 茌平县| 包头市| 太康县| 会昌县| 敦煌市| 永顺县| 长治市| 麦盖提县| 高雄市| 绩溪县| 和政县| 平阳县| 华坪县| 潜山县| 廉江市| 德钦县| 甘肃省| 香港| 东山县| 南京市| 新野县| 湟中县|