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

                  TABLE函數可接受查詢語句或游標作為輸入參數,并可輸出多行數據。該函數可以平行執行,并可持續輸出數據流,被稱作管道式輸出。應用TABLE函數可將數據轉換分階段處理,并省去中間結果的存儲和緩沖表.
                  TABLE函數(它是9i中的新特性),實際上是將一個存儲在內存中的對象(以流的方式存儲的)結構化以后,使這個對象能以表的方式查詢。他對流對象的結構化轉換就決定的它的效率大大遜于對普通表和臨時表的查詢效率.
                  TABLE函數可接受查詢語句或游標作為輸入參數,并可輸出多行數據。該函數可以平行執行,并可持續輸出數據流,被稱

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

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

          2.利用兩個實體化視圖(或表)作為樣板數據
          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.定義對象類型和基于對象類型的表類型
          定義對象類型并且為進一步引用做好準備
          (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. 定義表函數
          (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 (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)定義表函數: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')));


           

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

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

          <2010年12月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          好友的blog

          搜索

          •  

          積分與排名

          • 積分 - 117486
          • 排名 - 500

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 贵南县| 贡觉县| 大城县| 泰安市| 天气| 成安县| 乌鲁木齐市| 湘西| 穆棱市| 甘洛县| 中宁县| 南华县| 丹凤县| 察隅县| 富宁县| 吴堡县| 淄博市| 黑龙江省| 奇台县| 东兰县| 民勤县| 蕉岭县| 涡阳县| 游戏| 周口市| 盐池县| 长沙市| 龙川县| 贡嘎县| 黔南| 平陆县| 靖安县| 三河市| 牡丹江市| 开远市| 宁乡县| 崇阳县| 德庆县| 高安市| 广丰县| 嘉兴市|