2014-10-09 137 views
0

在oracle中可以找到哪個記錄先輸入,哪個記錄等等?這不一定是記錄的SCN,因爲我不關心確切的時間。我只想按照它們輸入的順序來排列記錄。oracle中記錄的順序

+1

您可能最終會找到一些_trick_來實現您的目的。 *但是*在一般情況下,您肯定應該將表格內容視爲*無序集合*。如果您需要以某種特定順序檢索行,則必須提供必要的信息作爲_your_數據的一部分。最終它可以在「幕後」自動生成(例如使用「序列」)。 – 2014-10-09 17:46:19

+1

作爲一種良好做法,始終有兩個「DATE」列。一個用於'DDL'變化,另一個用於'DML'變化。 – 2014-10-09 17:52:36

回答

2

一般而言,除非您有一列提供該信息(例如create_date)。

如果您可以假定行從未更新並且您的表是使用ROWDEPENDENCIES構建的,則可以通過ORA_ROWSCN進行訂購。但是很少有人會有這樣的表格,所以這通常不是特別有用的答案。

+0

這超出了我的理解,但是無法通過['ROWID'](http://docs.oracle.com/cd/B19306_01/server「)返回從_physical_位置推斷行插入的順序。 102/b14200/pseudocolumns008.htm)? – 2014-10-09 18:29:19

+2

@SylvainLeroux - 編號'ROWID'值可以重複用於不同的行,單行的'ROWID'可以隨時間變化,並且稍後分配的區段中行的'ROWID'可以早於'ROWID'先前分配的行。'ROWID'可以在一些非常有限的情況下工作 - 沒有刪除,沒有更新,單個數據庫中的所有數據等等,但是這比'ORA_ROWSCN'有效的可能性更小。 – 2014-10-09 18:33:14

0

在我與Oracle的多年工作中,我更關注自己開發的邏輯和編碼實踐。在這個特定的情況下,而不是(ab)使用數據庫,這將是一個很好的做法,有兩個DATE列。一個用於DDL更改,另一個用於DML更改。

我通常分別命名COLUMNSDT_TM_STAMPDT_TM_STAMP_CRTE分別爲DMLDDL的變化。與datetimestamp列相比,datetimestamp create列不會頻繁更改。因爲,我們都期待DML活動超過DDL。在任何時候,如果我們想知道什麼時候是特定記錄insertedupdateddeleted,我們所需要做的就是查找datetimestamp列。

更新我不清楚我對兩個datetime列的解釋。感謝Jeffrey Kemp指出,我所說的全部是DML而不是DDL

測試用例

有兩列,dt_tm_stamp_crte存儲行插入的日期時間,和dt_tm_stamp到keeep所有DML的軌道改變了該行。因此,當插入一行時,兩列的日期時間相同,但是,從下一個DML操作開始,只有dt_tm_stamp列將使用當前日期時間進行更新。

SQL> alter session set nls_date_format='MM/DD/YYYY HH24:MI:SS'; 

Session altered. 

SQL> DROP TABLE t; 

Table dropped. 

SQL> CREATE TABLE t AS SELECT * FROM emp WHERE 1 = 2; 

Table created. 

SQL> ALTER TABLE t ADD (dt_tm_stamp DATE, dt_tm_stamp_crte DATE); 

Table altered. 

SQL> INSERT INTO t SELECT e.*, SYSDATE, SYSDATE FROM emp e; 

14 rows created. 

SQL> SELECT ename, dt_tm_stamp, dt_tm_stamp_crte FROM t; 

ENAME  DT_TM_STAMP   DT_TM_STAMP_CRTE 
---------- ------------------- ------------------- 
SMITH  10/10/2014 13:19:53 10/10/2014 13:19:53 
ALLEN  10/10/2014 13:19:53 10/10/2014 13:19:53 
WARD  10/10/2014 13:19:53 10/10/2014 13:19:53 
JONES  10/10/2014 13:19:53 10/10/2014 13:19:53 
MARTIN  10/10/2014 13:19:53 10/10/2014 13:19:53 
BLAKE  10/10/2014 13:19:53 10/10/2014 13:19:53 
CLARK  10/10/2014 13:19:53 10/10/2014 13:19:53 
SCOTT  10/10/2014 13:19:53 10/10/2014 13:19:53 
KING  10/10/2014 13:19:53 10/10/2014 13:19:53 
TURNER  10/10/2014 13:19:53 10/10/2014 13:19:53 
ADAMS  10/10/2014 13:19:53 10/10/2014 13:19:53 
JAMES  10/10/2014 13:19:53 10/10/2014 13:19:53 
FORD  10/10/2014 13:19:53 10/10/2014 13:19:53 
MILLER  10/10/2014 13:19:53 10/10/2014 13:19:53 

14 rows selected. 

SQL> BEGIN 
    2 DBMS_LOCK.sleep(10); 
    3 END; 
    4/

PL/SQL procedure successfully completed. 

SQL> 
SQL> UPDATE t SET ename = 'LALIT', dt_tm_stamp = SYSDATE WHERE ename = 'SCOTT'; 

1 row updated. 

SQL> SELECT ename, dt_tm_stamp, dt_tm_stamp_crte FROM t WHERE ename = 'LALIT'; 

ENAME  DT_TM_STAMP   DT_TM_STAMP_CRTE 
---------- ------------------- ------------------- 
LALIT  10/10/2014 13:20:03 10/10/2014 13:19:53 

SQL> 

dt_tm_stamp列的更新可以通過TRIGGER來完成。我剛剛展示了列的重要性,如何實現它取決於開發人員。

+1

「DDL變更」是什麼意思,以及它與日期/時間列有什麼關係? – 2014-10-10 06:20:49

+0

除了DML更改之外,該表可能會有添加新列等的修改。因此,此附加日期時間創建列可以跟蹤該列。這只是一個額外的建議。 – 2014-10-10 07:22:39

+0

但這沒有意義。根據定義,任何DDL(例如添加列)都會影響*整個表格 - 因此無論如何它將在每個記錄上具有相同的日期時間值。 – 2014-10-10 07:26:24