posts - 495,comments - 227,trackbacks - 0

          在ORACLE存儲過程中創建臨時表

          存儲過程里不能直接使用DDL語句,所以只能使用動態SQL語句來執行

          --ON COMMIT DELETE ROWS 說明臨時表是事務指定,每次提交后ORACLE將截斷表(刪除全部行)
          --ON COMMIT PRESERVE ROWS 說明臨時表是會話指定,當中斷會話時ORACLE將截斷表。


          CREATE OR REPLACE PROCEDURE temptest
          (p_searchDate IN DATE)
          IS
          v_count INT;
          str varchar2(300);
          BEGIN
          v_count := 0;
          str:='drop table SETT_DAILYTEST';
          execute immediate str;
          str:='CREATE GLOBAL TEMPORARY TABLE SETT_DAILYTEST (
          NACCOUNTID NUMBER not null,
          NSUBACCOUNTID NUMBER not null)
          ON COMMIT PRESERVE ROWS';
          execute immediate str; ----使用動態SQL語句來執行
          str:='insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance)';
          execute immediate str;
          END temptest;

          上面建立一個臨時表的存儲過程

          下面是執行一些操作,向臨時表寫數據。

          CREATE OR REPLACE PROCEDURE PR_DAILYCHECK
          (
          p_Date IN DATE,
          p_Office IN INTEGER,
          p_Currency IN INTEGER,
          P_Check IN INTEGER,
          p_countNum OUT INTEGER)
          IS
          v_count INT;
          BEGIN
          v_count := 0;
          IF p_Date IS NULL THEN
          dbms_output.put_line('日期不能為空');
          ELSE
          IF P_Check = 1 THEN
          insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance
          where dtdate = p_Date);

          select
          count(sd.naccountid) into v_count
          from sett_subaccount ss,sett_account sa,sett_dailytest sd
          where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
          AND sa.nofficeid = p_Office AND sa.ncurrencyid = p_Currency
          and rownum < 2;
          COMMIT;
          p_countNum := v_count;
          dbms_output.put_line(p_countNum);
          END IF;
          IF P_Check = 2 THEN
          insert into SETT_DAILYTEST (select naccountid,nsubaccountid from sett_dailyaccountbalance
          where dtdate = p_Date);

          select
          count(sd.naccountid) into v_count
          from sett_cfsubaccount ss,sett_account sa,sett_dailytest sd
          where sd.naccountid = sa.id and sd.nsubaccountid = ss.id and sa.id = ss.naccountid
          AND sa.nofficeid = p_Office AND sa.ncurrencyid = p_Currency
          and rownum < 2;
          COMMIT;
          p_countNum := v_count;
          dbms_output.put_line(p_countNum);
          END IF;
          END IF;
          END PR_DAILYCHECK;



          需要創建一個臨時表,請舉例說明,謝謝!      
            ---------------------------------------------------------------      
               
            是TEMPORARY      
            CREATE     GLOBAL     TEMPORARY     TABLE     flight_schedule     (      
                      startdate     DATE,          
                      enddate     DATE,          
                      cost     NUMBER)      
               
            ---------------------------------------------------------------      
               
            create     proecdure     name_pro      
            as      
            str     varchar2(100);      
            begin      
            str:='CREATE     GLOBAL     TEMPORARY     TABLE     TABLENAME     ON     COMMIT     PRESERVE     ROWS     as     select     *     from     others_table';      
            execute     immediate     str;      
            end;      
            /  
             
             
             
            可以把臨時表指定為事務相關(默認)或者是會話相關:  
            ON   COMMIT   DELETE   ROWS:指定臨時表是事務相關的,Oracle在每次提交后截斷表。  
            ON   COMMIT   PRESERVE   ROWS:指定臨時表是會話相關的,Oracle在會話中止后截斷表。  
             
            =================  
            可以創建以下兩種臨時表:  
            1。會話特有的臨時表  
                  CREATE   GLOBAL   TEMPORARY   <TABLE_NAME>   (<column   specification>)  
                  ON   COMMIT   PRESERVE   ROWS;  
            ========  
            對全局臨時表的總結  
             
            在臨時表上的操作比在一般的表上的操作要快。因為:  
            1創建臨時表不需要往編目表中插入條目,臨時表的使用也不需要訪問編目表,因此也沒有對編目表的爭用。  
            2僅有創建臨時表的app才可存取臨時表,所以在處理臨時表時沒有鎖。  
            3如果指定NOT   LOGGED選項,在處理臨時表時不記日志。所以如果有僅在數據庫的一個會話中使用的大量臨時數據,把這些數據存入臨時表能大大提高性能。  
            DECLARE   GLOBAL   TEMPORARY   TABLE   TT(C1   INT,   C2   CHAR(20));  
            在CONNECT   RESET命令后,臨時表不再存在。  
            建臨時表是動態編譯的,所以對臨時表的使用也必須放在DECLARE   CURSER   后面  
            CREATE   PROCEDURE   INSTT2(P1   INT,   P2   CHAR(20))  
            BEGIN  
                DECLARE   GLOBAL   TEMPORARY   TABLE   TT(C1   INT,   C2   CHAR(20))   %  
                INSERT   INTO   SESSION.TT   VALUES(P1,   P2);  
                BEGIN  
                    DECLARE   C1   CURSOR   WITH   RETURN   FOR   SELECT   *   FROM   SESSION.TT;  
                END;  
            END   %  
             
            2。事務特有的臨時表  
                  CREATE   GLOBAL   TEMPORARY   <TABLE_NAME>   (<column   specification>)  
                  ON   COMMIT   DELETE   ROWS;  
                 
                在Oracle中,全局臨時表并不會刪除,實際上你只需要建立一次,以后直接應用就行了,這與MS和Sybase不一樣。實際上在斷開數據庫連接時,臨時 表中數據自動清空,不同的Session之間是隔離的,不許要當心相互影響,不過如果起用了連接共享的話,你要用On   Commit   delete   rows使數據僅在事物內部有效。

          3建立臨時表  
                  臨時表的定義對所有會話SESSION都是可見的,但是表中的數據只對當前的會話或者事務有效.    
                  建立方法:  
            1)   ON   COMMIT   DELETE   ROWS   定義了建立事務級臨時表的方法.  
            CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area  
                            (startdate   DATE,  
                              enddate   DATE,  
                              class   CHAR(20))  
                        ON   COMMIT   DELETE   ROWS;  
            EXAMPLE:  
            SQL>   CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area  
                2                     (startdate   DATE,  
                3                       enddate   DATE,  
                4                       class   CHAR(20))  
                5                 ON   COMMIT   DELETE   ROWS;  
            SQL>   create   table   permernate(   a   number);  
            SQL>   insert   into   admin_work_area   values(sysdate,sysdate,'temperary   table');  
            SQL>   insert   into   permernate   values(1);  
            SQL>   commit;  
            SQL>   select   *   from   admin_work_area;  
            SQL>   select     *   from   permernate;  
              A  
            1  
            2)ON   COMMIT   PRESERVE   ROWS   定義了創建會話級臨時表的方法.  
            CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area  
                            (startdate   DATE,  
                              enddate   DATE,  
                              class   CHAR(20))  
                      ON   COMMIT   PRESERVE   ROWS;  
            EXAMPLE:  
             
            會話1:  
            SQL>   drop   table   admin_work_area;  
            SQL>   CREATE   GLOBAL   TEMPORARY   TABLE   admin_work_area  
                2                     (startdate   DATE,  
                3                       enddate   DATE,  
                4                       class   CHAR(20))  
                5               ON   COMMIT   PRESERVE   ROWS;  
            SQL>   insert   into   permernate   values(2);  
            SQL>   insert   into   admin_work_area   values(sysdate,sysdate,'session   temperary');  
            SQL>   commit;  
            SQL>   select   *   from   permernate;  
             
                              A  
            ----------  
                              1  
                              2  
             
            SQL>   select   *   from   admin_work_area;  
             
            STARTDATE     ENDDATE         CLASS  
            ----------   ----------   --------------------  
            17-1&Ocirc;&Acirc;   -03   17-1&Ocirc;&Acirc;   -03   session   temperary  
             
            會話2:  
             
            SQL>   select   *   from   permernate;  
             
                              A  
            ----------  
                              1  
                              2  
             
            SQL>   select   *   from   admin_work_area;  
             
              未選擇行.  
             
            會話2看不見會話1中臨時表的數據.  

           

          posted on 2009-02-26 17:29 SIMONE 閱讀(8639) 評論(0)  編輯  收藏 所屬分類: oracle
          主站蜘蛛池模板: 甘泉县| 平邑县| 波密县| 调兵山市| 屏边| 札达县| 即墨市| 临泽县| 德清县| 洪雅县| 科技| 阿拉善左旗| 河北区| 沾化县| 赤水市| 玉溪市| 崇信县| 祥云县| 美姑县| 海丰县| 尉氏县| 安图县| 澄城县| 岫岩| 军事| 宣威市| 康平县| 长武县| 沂源县| 囊谦县| 聂拉木县| 安远县| 镇远县| 五大连池市| 萨嘎县| 岳普湖县| 团风县| 乐东| 大同县| 沐川县| 麦盖提县|