乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      使用DB2中已聲明的全局臨時表

       WindySky 2010-04-16
      本文適用于 DB2 UDB Version 8.1 for Linux,UNIX 和 Windows。

        簡介

        自 DB2 v7.2 以來,DB2 UDB 已經(jīng)支持在駐留內(nèi)存、非持久性、特定于會話的表中存儲數(shù)據(jù),這些表的正式名稱為已聲明的全局臨時表(以下簡稱為臨時表)。本文不會詳述定義或使用臨時表的各種方法,而是重點(diǎn)介紹一種有趣而鮮為人知的技術(shù),用于在應(yīng)用程序與存儲過程間共享臨時表。

        提示:如果您以前從未使用過臨時表,請查閱 DB2 UDB v8 SQL Reference 第 5 章中標(biāo)題 DECLARE GLOBAL TEMPORARY TABLE 下的內(nèi)容。

        使用臨時表

        我們記得為了要使用臨時表,數(shù)據(jù)庫中必須存在一個用戶臨時表空間(默認(rèn)情況下沒有)。這里先教您如何創(chuàng)建這樣一個表空間:

        create user temporary tablespace usertemp1

        managed by system using (''usertemp1'')

        臨時表在進(jìn)行引用之前必須先聲明。下面的 SQL 過程(從命令行創(chuàng)建)演示了這個過程:

        清單 1. 在 SQL 過程中使用臨時表的例子

        db2 –td@

        connect to sample @

        create procedure temp_table_sample()

        specific temp_table_sample

        begin

        declare global temporary table -- (1)

        session.temp (id int, data varchar(10))

        not logged on commit preserve rows;

        insert into session.temp values (1, ''A''); -- (2)

        end

        @

        提示:如果您想進(jìn)一步尋找有關(guān) DB2 SQL PL 的指南,請購買 DB2 SQL Procedural Language for Linux, UNIX, and Windows(ISBN 0131007726),可從任何在線書店訂購。

        只有在(2)處引用之前,先在(1)處聲明臨時表,該 SQL 過程才能起作用。

        雖然臨時表總是用于 SQL 過程中,但也能被任何可連接 DB2 的應(yīng)用程序創(chuàng)建。下面很快就能看到,您甚至可以通過 DB2 命令行處理器(CLP)使用臨時表。

        當(dāng)聲明臨時表的位置與使用它的位置不同時,會引起問題??紤]以下情況:

        一個應(yīng)用程序需要聲明臨時表 T,填充它后并調(diào)用過程 P 來處理數(shù)據(jù)。應(yīng)用程序和過程 P 如何都能引用 T 而無需過程 P 再重復(fù)聲明 T 呢?

        存儲過程 P1 聲明臨時表 T,填充它后并且希望調(diào)用過程 P2 和 P3 來處理數(shù)據(jù)。P2 和 P3 又如何能引用 P1 中聲明的臨時表而無需再重新聲明呢?

        這兩種情況下,若在相同會話中企圖重新聲明臨時表將導(dǎo)致如下錯誤:

        SQL0601N The name of the object to be created is identical to the

        existing name "SESSION.TEMP" of type "DECLARED TEMPORARY TABLE".

        SQLSTATE=42710

        解決這些問題的關(guān)鍵是要明白如果您事先在當(dāng)前的連接中已經(jīng)聲明了臨時表,那么就可以創(chuàng)建存儲過程來引用該臨時表而無需再聲明了。清單 2 舉例說明了如何實(shí)現(xiàn)該方法:

        清單 2. 在 SQL 過程中使用臨時表的例子

        CONNECT TO SAMPLE@

        -- Declare a temporary table from CLP

        DECLARE GLOBAL TEMPORARY TABLE temp_employee LIKE employee ON COMMIT PRESERVE ROWS@

        -- create a procedure which references the temporary table.

        CREATE PROCEDURE p1

        RESULT SETS 1

        BEGIN

        DECLARE cur CURSOR WITH HOLD WITH RETURN TO CLIENT FOR

        SELECT empno, firstnme, lastname

        FROM SESSION.temp_employee

        FETCH FIRST 5 ROWS ONLY;

        OPEN cur;

        END

        @

        -- Now, from the CLP (an application)

        -- INSERT into the temp table

        INSERT INTO SESSION.temp_employee SELECT * FROM EMPLOYEE@

        -- CALL the procedure, which returns an open cursor back to the

        -- CLP, proving that the temp table data was received.

        CALL p1@

        在上面的例子中,創(chuàng)建 CLP 連接后聲明了一個臨時表。然后創(chuàng)建了引用臨時表的過程 p1。這里要注意的關(guān)鍵是,即使在過程體中沒有聲明臨時表,該過程也被成功創(chuàng)建。為了證實(shí)此概念,創(chuàng)建過程后,我們手工填充了臨時表,并調(diào)用 p1 來顯示該表的內(nèi)容。清單 3 給出了輸出結(jié)果:

        清單 3. 執(zhí)行過程 p1 的輸出

        Result set 1

        --------------

        EMPNO FIRSTNME LASTNAME

        ------ ------------ ---------------

        000010 CHRISTINE HAAS

        000020 MICHAEL THOMPSON

        000030 SALLY KWAN

        000050 JOHN GEYER

        000060 IRVING STERN

        5 record(s) selected.

        Return Status = 0

        既然我們已經(jīng)利用有趣的方法創(chuàng)建了使用臨時表的過程,接下來就演示臨時表及其數(shù)據(jù)如何可以:

        在兩個或更多存儲過程之間共享。

        在一個應(yīng)用程序和一個存儲過程之間共享。

        在 DB2 Development Center 中使用臨時表

        步驟 1:在 Development Center 中,創(chuàng)建名為 init_temp() 的過程來封裝臨時表 session.temp 的聲明。

        清單 4. 封裝臨時表聲明的過程

        CREATE PROCEDURE INIT_TEMP()

        SPECIFIC INIT_TEMP

        BEGIN

        DECLARE GLOBAL TEMPORARY TABLE

        SESSION.TEMP (id INT, data VARCHAR(10))

        ON COMMIT PRESERVE ROWS;

        END

        使用過程來初始化臨時表可帶來三個主要優(yōu)點(diǎn):

        從 DB2 Development Center 很容易為數(shù)據(jù)庫連接聲明臨時表。

        過程開發(fā)人員不必為了得到臨時表的 DDL 而找遍應(yīng)用程序代碼(可能是由其他人來維護(hù)的)。

        如果在應(yīng)用程序代碼中的多個位置實(shí)例化相同的臨時表,該表的定義可以集中在一個地方。因此,假如要求改變表結(jié)構(gòu),就不必搜索所有的聲明,而只需在一個地方改變其定義。

        步驟 2:在 Development Center 中,創(chuàng)建過程 close_temp() 來刪除臨時表 session.temp:

        清單 5. 封裝刪除臨時表的過程

        CREATE PROCEDURE CLOSE_TEMP()

        SPECIFIC CLOSE_TEMP

        BEGIN

        DROP TABLE SESSION.TEMP;

        END

        使用過程來刪除臨時表有以下兩個優(yōu)點(diǎn):

        在 DB2 Development Center 中執(zhí)行操作時允許刪除會話的臨時表。

        完成了通過存儲過程聲明臨時表的封裝。

        注意:刪除臨時表并非是絕對必要的,因?yàn)楫?dāng)應(yīng)用程序斷開連接時它們就會被自動刪除。然而,如果您的應(yīng)用程序使用了連接池,那在返回到連接池的連接前就務(wù)必要刪除臨時表。

        過程 init_temp() 和 close_temp() 為共享臨時表奠定了基礎(chǔ)。

        例 1:創(chuàng)建引用臨時表的過程

        步驟 1:在 Development Center 中,運(yùn)行 init_temp() 過程 來聲明 Development Center 的連接環(huán)境下的臨時表。

        圖 1. 運(yùn)行 init_temp

       

        Development Center 在過程運(yùn)行完畢后還將保持連接狀態(tài)。因此,在運(yùn)行 close_temp() 或是重設(shè) Development Center 的連接之前,該臨時表依然繼續(xù)存在。

        步驟 2:創(chuàng)建以下過程 insert_to_temp() ,用于執(zhí)行 session.temp 上的插入操作。請注意 insert_to_temp() 不需要再聲明臨時表了。

        CREATE PROCEDURE INSERT_TO_TEMP()

        SPECIFIC INSERT_TO_TEMP

        BEGIN

        INSERT INTO SESSION.TEMP VALUES (1, ''one'');

        INSERT INTO SESSION.TEMP VALUES (2, ''two'');

        INSERT INTO SESSION.TEMP VALUES (3, ''three'');

        END

        步驟 3:創(chuàng)建 count_rows()過程, 返回在臨時表中找到的行數(shù)。再次說明,可以引用 session.temp 是因?yàn)樵诓襟E 1 中我們調(diào)用了 init_temp()。

        CREATE PROCEDURE COUNT_ROWS(OUT p_count INTEGER)

        BEGIN

        DECLARE cur CURSOR FOR

        SELECT count(*) FROM session.temp;

        OPEN cur;

        FETCH cur INTO p_count;

        CLOSE cur;

        END

        步驟 4:運(yùn)行 insert_to_temp() 。向臨時表填充三行記錄。

        步驟 5:運(yùn)行 count_rows() 。輸出參數(shù) p_count 將顯示找到了 3 行記錄。

        這個例子中,我們演示了如何在兩個過程中共享一個臨時表。當(dāng)然,該技術(shù)能很容易地擴(kuò)展為在任意多個過程間共享任意多個臨時表。

        步驟 6:刪除。運(yùn)行 close_temp() 來刪除臨時表。

        例 2:在應(yīng)用程序和存儲過程之間共享臨時表

        對于這些例子,我們將使用 CLP 作為應(yīng)用程序。

        步驟 1:連接數(shù)據(jù)庫并運(yùn)行 init_temp() 來聲明 CLP 連接環(huán)境中的臨時表。

        CONNECT TO SAMPLE

        CALL INIT_TEMP()

        步驟 2:向 session.temp 表插入幾行記錄。

        INSERT INTO SESSION.TEMP VALUES (1, ''two'')

        INSERT INTO SESSION.TEMP VALUES (2, ''two'')

        步驟 3:運(yùn)行 count_rows() 過程,并確認(rèn)該過程能夠查看到剛才插入的行。

        CALL count_rows(?)

        Value of output parameters

        --------------------------

        Parameter Name : P_COUNT

        Parameter Value : 2

        Return Status = 0

        步驟 4:刪除。運(yùn)行 close_temp() 刪除臨時表。

        CALL CLOSE_TEMP @

        這個例子中,我們演示了應(yīng)用程序如何與存儲過程共享臨時表。

        最后注意

        對已聲明的全局臨時表的支持在 DB2 UDB v8.1 中得到了顯著的加強(qiáng)。比如,可以在上面創(chuàng)建索引和生成統(tǒng)計結(jié)果。您可以查閱 DB2 SQL Reference 中的 DECLARE GLOBAL TEMPORARY TABLE,那里有關(guān)于創(chuàng)建及使用臨時表的全部詳細(xì)過程。

        臨時表存儲在用戶臨時表空間中。如果是使用大型數(shù)據(jù)集,可考慮用專用的緩沖池來代替表空間??梢酝ㄟ^表空間快照來決定是否將數(shù)據(jù)真正寫入磁盤。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多