oracle中记录的顺序

时间:2014-10-09 17:26:55

标签: oracle

是否有可能在oracle中找到首先输入的记录,哪个记录首先输入,依此类推?这不一定是记录的SCN,因为我不关心确切的时间。我只想按照输入的顺序订购记录。

2 个答案:

答案 0 :(得分:2)

一般情况下,除非您有一些提供该信息的专栏(例如create_date)。

如果您可以假设行永远不会更新且您的表格是使用ROWDEPENDENCIES构建的,则可以按ORA_ROWSCN订购。但是你很少有这样的表格,因此一般来说这不是一个特别有用的答案。

答案 1 :(得分:0)

在Oracle的这些年里,我对自己开发的逻辑和编码实践更加信任。在这个特定的场景中,有两个DATE列,而不是(ab)使用数据库,这是一个很好的做法。一个用于DDL更改,另一个用于DML更改。

我通常将COLUMNS分别命名为DT_TM_STAMP,将DT_TM_STAMP_CRTE命名为DMLDDL。与datetimestamp列相比,datetimestamp create列不会经常更改。因此,我们都希望DML活动超过DDL。在任何时候,如果我们想知道特定记录insertedupdateddeleted的时间,我们需要做的就是查找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完成。我刚刚演示了列的重要性,如何实现它取决于开发人员。