Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oracle中记录的顺序_Oracle - Fatal编程技术网

oracle中记录的顺序

oracle中记录的顺序,oracle,Oracle,在oracle中,有没有可能找到哪个记录是先输入的,哪个记录是第二个,依此类推?这不一定是记录的SCN,因为我不关心确切的时间。我只想按照记录的输入顺序对记录进行排序。一般来说,除非您有提供该信息的列(例如create\u date) 如果您可以假设从不更新行,并且您的表是使用ROWDEPENDENCIES构建的,那么您可以通过ORA\u ROWSCN进行排序。但是,很少有人会有这样一个表,所以一般来说,这不是一个特别有用的答案。在我与Oracle共事的所有岁月中,我对自己开发的逻辑和编码实践更

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

一般来说,除非您有提供该信息的列(例如
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完成的。