是否有可能在oracle中找到首先输入的记录,哪个记录首先输入,依此类推?这不一定是记录的SCN,因为我不关心确切的时间。我只想按照输入的顺序订购记录。
答案 0 :(得分:2)
一般情况下,除非您有一些提供该信息的专栏(例如create_date
)。
如果您可以假设行永远不会更新且您的表格是使用ROWDEPENDENCIES
构建的,则可以按ORA_ROWSCN
订购。但是你很少有这样的表格,因此一般来说这不是一个特别有用的答案。
答案 1 :(得分:0)
在Oracle的这些年里,我对自己开发的逻辑和编码实践更加信任。在这个特定的场景中,有两个DATE
列,而不是(ab)使用数据库,这是一个很好的做法。一个用于DDL
更改,另一个用于DML
更改。
我通常将COLUMNS
分别命名为DT_TM_STAMP
,将DT_TM_STAMP_CRTE
命名为DML
和DDL
。与datetimestamp列相比,datetimestamp create列不会经常更改。因此,我们都希望DML
活动超过DDL
。在任何时候,如果我们想知道特定记录inserted
,updated
或deleted
的时间,我们需要做的就是查找datetimestamp列。
更新我不清楚我对两个日期时间列的解释。感谢Jeffrey Kemp指出我所谈论的只是 DML 而不是 DDL 。
测试用例
有两列,dt_tm_stamp_crte
用于存储行的日期时间,dt_tm_stamp
用于保存对行的所有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
完成。我刚刚演示了列的重要性,如何实现它取决于开发人员。