這時如何在架構上讓資料抓取(Data Extraction)和報表呈現(Report Presentation)做有效的區隔就很重要(這邊注重的是資料庫端, 在應用端已有很多方案像Struts等). 就資料庫端而言, 有一個Oracle的技術 'Global Temporary Tables(GTT)' 就有探討的價值. 簡單的說, GTT可以將複雜的資料抓取邏輯隱藏並將結果用報表呈現人員習慣的Table 方式呈現. 另一個重點是該Table的資料只在特定Session中存在, 如果Session結束, 資料即消失, 但是 Table本身還是存在.
下面就來做個測試吧!
SQL> CREATE GLOBAL TEMPORARY TABLE worktable (x NUMBER(3));這時可以在行開啟另一個SQLPlus session, 可以看到方才另一個Session 建的GCC, 並且可以做DML, 如下.
Table created.
SQL> INSERT INTO worktable (x) VALUES (1);SQL> CREATE GLOBAL TEMPORARY TABLE worktable
1 row created.
SQL> SELECT * FROM worktable;
X
----------
1
SQL> commit;
Commit complete.
SQL> SELECT * FROM worktable;
no rows selected
ㄟ!見鬼了, 怎麼一 Commit資料就不見了, 原因在見下面建GCC的參數. 建立GCC時,
用'On Commit Preserve Rows', Commit完後, 資料便不會消失.
2 (x NUMBER(3))這時如果從其他Sesseion看相同的GCC是看不到資料的, 如下.
3 ON COMMIT PRESERVE ROWS;
Table created.
SQL> INSERT INTO worktable (x) VALUES (1);
1 row created.
SQL> SELECT * FROM worktable;
X
----------
1
SQL> commit;
Commit complete.
SQL> SELECT * FROM worktable;
X
----------
1
SQL> SELECT * FROM worktable;再試試 truncate 吧!
no rows selected
SQL> INSERT INTO worktable (x) VALUES (2)
1 row created.下Truncate指令一樣只會把Session內的資料清除.
SQL> commit;
Commit complete.
SQL> SELECT * FROM worktable;
X
----------
2
SQL> TRUNCATE TABLE worktable;
Table truncated.
SQL> SELECT * FROM worktable;
no rows selected
SQL> commit;
Commit complete.