<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(8631) 評論(0)  編輯  收藏 所屬分類: oracle
    主站蜘蛛池模板: 久久久久久精品免费免费自慰| 亚欧国产一级在线免费| 久久一本岛在免费线观看2020| 国产亚洲精久久久久久无码AV| 另类小说亚洲色图| 亚洲AV网站在线观看| 理论秋霞在线看免费| 最新精品亚洲成a人在线观看| eeuss影院www天堂免费| 国产偷国产偷亚洲清高动态图| 久久精品成人免费观看97| 亚洲国产精品嫩草影院在线观看 | 国产亚洲精品bv在线观看| 国内精品乱码卡1卡2卡3免费| 亚洲成a人片在线看| 国产精品视_精品国产免费| 一级毛片试看60分钟免费播放 | 国产∨亚洲V天堂无码久久久| 四虎国产精品永久免费网址| 亚洲毛片无码专区亚洲乱| 无码人妻一区二区三区免费手机| 亚洲欧美日韩中文字幕在线一区| 国产一级淫片a视频免费观看| a级毛片免费网站| 亚洲视频免费在线观看| 国产精品成人免费一区二区 | 亚洲国产成人久久精品动漫| 182tv免费视视频线路一二三| 亚洲综合激情五月色一区| 亚洲成av人在片观看| 国产免费拔擦拔擦8X高清在线人| 亚洲精品自拍视频| 国产jizzjizz视频免费看| 国产日韩精品无码区免费专区国产 | 蜜臀AV免费一区二区三区| 亚洲av最新在线观看网址| 国产亚洲免费的视频看| 毛片A级毛片免费播放| 久久久免费观成人影院| 亚洲人成网站日本片| 久久精品国产亚洲Aⅴ蜜臀色欲|