如何在 Oracle 中臨時儲存資料以供以後使用?
問題
您想臨時儲存 SQL 的結果。
解決方案
我們可以使用 CREATE GLOBAL TEMPORARY TABLE 語句建立一個表,該表臨時儲存會話的資料。此外,您可以指定是保留會話的臨時表資料還是在事務提交之前保留。我們還可以使用 ON COMMIT PRESERVE ROWS 子句來指定在使用者會話結束時刪除資料。
示例
CREATE GLOBAL TEMPORARY TABLE tmp_players ON COMMIT PRESERVE ROWS AS SELECT * FROM players WHERE coach_id IS NOT NULL;
全域性臨時表儲存僅在會話期間存在的會話私有資料。一旦建立臨時表,它就會一直存在,直到我們刪除它。
示例
select table_name, temporary from user_tables WHERE temporary = 'Y'; TMP_PLAYERS Y
當我們在臨時表中建立記錄時,會在我們的預設臨時表空間中分配空間。我們可以透過執行以下 SQL 來驗證這一點。
示例
SELECT username, contents, segtype FROM v$sort_usage;
為了提高表的效能,我們可以在會話結束時建立索引並刪除它們。
最後,我們可以使用 ON COMMIT DELETE ROWS 子句指示應在會話結束時刪除資料。以下示例說明了這一點。
示例
CREATE GLOBAL TEMPORARY TABLE tmp_players ON COMMIT DELETE ROWS AS SELECT * FROM players WHERE coach_id IS NOT NULL;
資料準備:問題使用的資料如下所示。
示例
DROP TABLE players; COMMIT; CREATE TABLE players ( player_rank NUMBER(6) , first_name VARCHAR2(20) , last_name VARCHAR2(25) CONSTRAINT player_last_name_nn NOT NULL , email VARCHAR2(30) CONSTRAINT player_email_nn NOT NULL , phone_number VARCHAR2(20) , player_start_date DATE CONSTRAINT player_start_date_nn NOT NULL , title_id VARCHAR2(20) CONSTRAINT player_title NOT NULL , prize_money NUMBER(8,2) , coach_id NUMBER(6) , CONSTRAINT player_email UNIQUE (email) ) ;
示例
INSERT INTO players VALUES (1,'Roger','Federer','roger.federer@notreal.com','111.111.1234',TO_DATE('17-06-2003', 'dd-MM-yyyy'),'AUS_OPEN','350000',1); INSERT INTO players VALUES (2,'Rafa','Nadal','Rafa.Nadal@notreal.com','111.111.1235',TO_DATE('17-06-2003', 'dd-MM-yyyy'),'FRENCH_OPEN','300000',1); INSERT INTO players VALUES (3,'Andy','Murray','Andy.Murray@notreal.com','111.111.1236',TO_DATE('17-06-2003', 'dd-MM-yyyy'),'WIMBELDON','450000',1); INSERT INTO players VALUES (4,'Stan','Wawrinka','Stan.Wawrinka@notreal.com','111.111.1237',TO_DATE('17-06-2003', 'dd-MM-yyyy'),'FRENCH_OPEN','300000',2); INSERT INTO players VALUES (5,'Dominic','Theim','Dominic.Theim@notreal.com','111.111.1238',TO_DATE('17-06-2003', 'dd-MM-yyyy'),'US_OPEN','500000',2); INSERT INTO players VALUES (6,'Novak','Djokovic','Novak.Djokovic@notreal.com','111.111.1239',TO_DATE('17-06-2003', 'dd-MM-yyyy'),'AUS_OPEN','350000',2); INSERT INTO players VALUES (7,'Andy','Zverev','Andy.Zverev@notreal.com','111.111.1240',TO_DATE('17-06-2003', 'dd-MM-yyyy'),'FRENCH_OPEN','300000',2); INSERT INTO players VALUES (8,'Andy','Rublev','Andy.Rublev@notreal.com','111.111.1241',TO_DATE('17-06-2003', 'dd-MM-yyyy'),'WIMBELDON','450000',3); INSERT INTO players VALUES (9,'Janik','Sinner','Janik.Sinner@notreal.com','111.111.1242',TO_DATE('17-06-2003', 'dd-MM-yyyy'),'FRENCH_OPEN','300000',3); INSERT INTO players VALUES (10,'Danil','Medvedev','Danil.Medvedev@notreal.com','111.111.1243',TO_DATE('17-06-2003', 'dd-MM-yyyy'),'US_OPEN','500000',3); COMMIT;
廣告