oracle中记录的顺序
在oracle中,有没有可能找到哪个记录是先输入的,哪个记录是第二个,依此类推?这不一定是记录的SCN,因为我不关心确切的时间。我只想按照记录的输入顺序对记录进行排序。一般来说,除非您有提供该信息的列(例如oracle中记录的顺序,oracle,Oracle,在oracle中,有没有可能找到哪个记录是先输入的,哪个记录是第二个,依此类推?这不一定是记录的SCN,因为我不关心确切的时间。我只想按照记录的输入顺序对记录进行排序。一般来说,除非您有提供该信息的列(例如create\u date) 如果您可以假设从不更新行,并且您的表是使用ROWDEPENDENCIES构建的,那么您可以通过ORA\u ROWSCN进行排序。但是,很少有人会有这样一个表,所以一般来说,这不是一个特别有用的答案。在我与Oracle共事的所有岁月中,我对自己开发的逻辑和编码实践更
create\u date
)
如果您可以假设从不更新行,并且您的表是使用
ROWDEPENDENCIES
构建的,那么您可以通过ORA\u ROWSCN
进行排序。但是,很少有人会有这样一个表,所以一般来说,这不是一个特别有用的答案。在我与Oracle共事的所有岁月中,我对自己开发的逻辑和编码实践更加信任。在这个特定场景中,最好使用两个DATE
列,而不是(ab)使用数据库。一个用于DDL
更改,另一个用于DML
更改
我通常将列
分别命名为DT_TM_STAMP
和DT_TM_STAMPDML
和DDL
更改。与datetimestamp列相比,datetimestamp创建列不会经常更改。因为,我们都期望DML
活动超过DDL
。在任何时候,如果我们想知道某个特定记录是何时插入的、何时更新的或何时删除的,我们只需查找datetimestamp列
更新我对这两个datetime列的解释不清楚。感谢Jeffrey Kemp指出我所说的是DML而不是DDL
测试用例
有两列,dt_tm_stamp_crte
用于存储插入行的日期时间,以及dt_tm_stamp
用于跟踪对行的所有DML更改。因此,第一次插入行时,两列的datetime相同,但是,从下一次DML操作开始,只有dt_tm_stamp
列将使用当前datetime更新
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
完成。我刚刚演示了专栏的重要性,如何实现这一点取决于开发人员。您可能会找到一些技巧来实现您的目的。但在一般情况下,您必须将表内容视为无序集。如果需要按特定顺序检索行,则必须提供必要的信息作为数据的一部分。最终,它可以在“幕后”自动生成(例如使用序列
)。作为一种良好的做法,总是有两列日期
列。一个用于DDL
更改,另一个用于DML
更改。这超出了我的知识范围,但无法从?@SylvainLeroux-No.返回的物理位置推断行插入顺序。ROWID
值可用于不同的行,单行的ROWID
可能会随着时间的推移而改变,在以后分配的区段中的行的ROWID
可能早于先前分配的行的ROWID
。ROWID
可能在一些非常有限的情况下工作——没有删除、没有更新、所有数据都在一个范围内,等等。但这甚至比ORA_ROWSCN
更不可能有效。您所说的“DDL更改”是什么意思?它与日期/时间列有什么关系?除了DML更改之外,该表可能有一些修改,如添加新列等。因此,这个额外的datetime create列可以跟踪这些修改。这只是一个额外的建议,但没有意义。根据定义,任何DDL(如添加列)都会影响整个表,因此它在每个记录上都是相同的datetime值。不,我没有误解你的意思,我没有得到的是在表中的每个记录上存储完全相同的日期/时间的实用程序。如果我要浪费那么多的存储空间,那么肯定有一些用例可以使用这些数据。“对于DML和DDL更改,我通常将列分别命名为DT_TM_STAMP和DT_TM_STAMP_CRTE。”您说DT_TM_STAMP_CRTE是用于最后一次DDL更改,而不是插入行的时间。插入(创建)记录是由DML而不是DDL完成的。