[20131130]12c建表period for valid.txt

[20131130]12c建表period for valid.txt

9i以后查询过去某个时间点,加入as of timestap 或者 as of scn,但是这个受undo*参数的控制。 当然11G加入Flashback Data
Archive特性,就是通过一个表空间记录表的一些变化,查询历史数据. 实际上这个就是flashback table的扩展(个人认为)!.

12c 有一个新特性 Temporal Validity. 通过加入有效的日期字段,来实现flashback query的特性,可以把它当作flashback query的扩
展。

-- 注意这个特性并不能应用在pdb数据库。

自己测试如下:
1.建立测试环境:

SCOTT@ztest> @ver
BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

SCOTT@ztest> create table t (id number,name varchar2(20),start_date date,end_date date,period for valid(start_date,end_date));
Table created.

--通过period for valid包含两个日期参数,实现这个特性。

2.插入一些测试数据:

insert into t (id,name,start_date,end_date) values ( 1, 'a', trunc(sysdate-5), trunc(sysdate-4) );
insert into t (id,name,start_date,end_date) values ( 2, 'b', trunc(sysdate-4), trunc(sysdate-3) );
insert into t (id,name,start_date,end_date) values ( 3, 'c', trunc(sysdate-3), trunc(sysdate-2) );
insert into t (id,name,start_date,end_date) values ( 4, 'd', trunc(sysdate-2), trunc(sysdate-1) );
insert into t (id,name,start_date,end_date) values ( 5, 'e', trunc(sysdate-1), trunc(sysdate-0) );
commit;

如果插入
SCOTT@ztest> insert into t (id,name,start_date,end_date) values ( 6, 'f', trunc(sysdate+1), trunc(sysdate) );
insert into t (id,name,start_date,end_date) values ( 6, 'f', trunc(sysdate+1), trunc(sysdate) )
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.VALID6B1F6) violated

--因为要求start_date
SCOTT@ztest> SELECT DBMS_METADATA.get_ddl ('TABLE', 'T')  FROM DUAL;
DBMS_METADATA.GET_DDL('TABLE','T')
-----------------------------------------------------------------------------------------
  CREATE TABLE "SCOTT"."T"
   (    "ID" NUMBER,
        "NAME" VARCHAR2(20),
        "START_DATE" DATE,
        "END_DATE" DATE,
         CONSTRAINT "VALID6B1F6" CHECK ((START_DATE 0)) ENABLE
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"
  ILM ENABLE LIFECYCLE MANAGEMENT

SELECT obj#,
       col#,
       segcol#,
       SEGCOLLENGTH,
       OFFSET,
       NAME,
       TYPE#,
       LENGTH,
       INTCOL#,
       default$
  FROM sys.col$
 WHERE obj# IN (SELECT data_object_id
                  FROM dba_objects
                 WHERE owner = USER AND object_name = 'T');

      OBJ#       COL#    SEGCOL# SEGCOLLENGTH     OFFSET NAME                      TYPE#     LENGTH    INTCOL# DEFAULT$
---------- ---------- ---------- ------------ ---------- -------------------- ---------- ---------- ---------- -----------------------------
     92045          0          0           22          0 VALID                         2         22          1 438774
     92045          1          1           22          0 ID                            2         22          2
     92045          2          2           20          0 NAME                          1         20          3
     92045          3          3            7          0 START_DATE                   12          7          4
     92045          4          4            7          0 END_DATE                     12          7          5

--可以发现插入一个valid字段,相当于隐含字段。缺省值438774.

SCOTT@ztest> select t.valid,t.* from t ;
     VALID         ID NAME                 START_DATE          END_DATE
---------- ---------- -------------------- ------------------- -------------------
    438774          1 a                    2013-11-27 00:00:00 2013-11-28 00:00:00
    438774          2 b                    2013-11-28 00:00:00 2013-11-29 00:00:00
    438774          3 c                    2013-11-29 00:00:00 2013-11-30 00:00:00
    438774          4 d                    2013-11-30 00:00:00 2013-12-01 00:00:00
    438774          5 e                    2013-12-01 00:00:00 2013-12-02 00:00:00

3.测试period for valid特性:
SCOTT@ztest> select sysdate-3,t.* from t as of period for valid sysdate-3;
SYSDATE-3                   ID NAME                 START_DATE          END_DATE
------------------- ---------- -------------------- ------------------- -------------------
2013-11-29 09:39:44          3 c                    2013-11-29 00:00:00 2013-11-30 00:00:00

--仅仅显示1条记录。

SCOTT@ztest> @dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  b0s6qymaxn4d1, child number 0
-------------------------------------
select t.* from t as of period for valid sysdate-3

Plan hash value: 1601196873

--------------------------------------------------------
| Id  | Operation         | Name | E-Rows | Cost (%CPU)|
--------------------------------------------------------
|   0 | SELECT STATEMENT  |      |        |     3 (100)|
|*  1 |  TABLE ACCESS FULL| T    |      1 |     3   (0)|
--------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter((("T"."START_DATE" IS NULL OR
              "T"."START_DATE"
              "T"."END_DATE">SYSDATE@!-3)))

--注意过滤条件。(("T"."START_DATE" IS NULL OR "T"."START_DATE"SYSDATE@!-3))
--也就是日期不为空的情况下在start_date与end_date之间的才显示。

时间: 2024-08-26 12:07:48

[20131130]12c建表period for valid.txt的相关文章

[20130803]12C在表中使用sequence.txt

[20130803]12C在表中使用sequence.txt 记得以前学习数据库的时候,第1个接触的数据库是informix,里面可以在表上定义顺序号,这样在插入时无需指定,保证唯一.(也许记忆有错,毕竟很久没使用它了).oracle 12c开始支持这种特性,我的感觉这些主要为了别的数据库移植到oracle上来. 做一个测试看看: SQL> @ver BANNER                                                                   

[20131212]12c新特性建表 属性DEFAULT ON NULL.txt

[20131212]12c新特性建表 属性DEFAULT ON NULL.txt 在12c上建立表可以让插入NULL等于某个特定的值.举一个例子: SCOTT@ztest> @verBANNER                                                                               CON_ID--------------------------------------------------------------------

[20130901]12C在表中使用sequence(补充).txt

[20130901]12C在表中使用sequence(补充).txt 对以前写的内容做一些补充. SQL> @ver BANNER                                                                               CON_ID-------------------------------------------------------------------------------- ----------Oracle Da

如何查看Oracle数据表的建表语句

oracle|数据|语句 如何查看Oracle数据表的建表语句? 系统环境:  1.操作系统:Windows 2000 Server,机器内存128M 2.数据库: Oracle 8i R2 (8.1.6) for NT 企业版 3.安装路径:C:\ORACLE 实现步骤:  1.用EXP工具导出 2.导入时使用show=y选项.log选项 3.查看.编辑日志文件 具体实例:  1.调出SQL*Plus conn system/manager grant connect,resource to

如何查看Oracle数据表的建表语句?

oracle|数据|语句 如何查看Oracle数据表的建表语句? 系统环境:  1.操作系统:Windows 2000 Server,机器内存128M 2.数据库: Oracle 8i R2 (8.1.6) for NT 企业版 3.安装路径:C:\ORACLE 实现步骤:  1.用EXP工具导出 2.导入时使用show=y选项.log选项 3.查看.编辑日志文件 具体实例:  1.调出SQL*Plus conn system/manager grant connect,resource to 

SqlServer编写数据库表的操作方式(建库、建表、修改语句)_MsSql

学习要点: SQL之-建库.建表.建约束.关系SQL基本语句大全.txt举得起放得下叫举重,举得起放不下叫负重.头要有勇气,抬头要有底气.学习要加,骄傲要减,机会要乘,懒惰要除.人生三难题:思,相思,单相思. SQL之-建库.建表.建约束.关系.部分T-sql语句 ---创建库 创建库之前 先进行 查看数据库中是否 已存在 次数据库 有便删除 --- if exists(select * from sys.sysdatabases where name='ConstructionDB')begi

[20170520]利用undo表空间保护数据.txt

[20170520]利用undo表空间保护数据.txt --//undo表空间是用来记录前映像信息,也用来保证查询时一致性的.上个星期去听一些课,提到不打开归档情况下一些维护技巧, --//就是建立多个redo日志文件,用来保存日志,至少维持3-4天甚至1个星期的日志,这样可以一定程度减少错误以及会查问题. --//另外提到一种利用undo表空间避免异常操作的恢复方法,就是再建立1个undo表空间,出现异常dml语句时切换使用新的undo表空间. --//这样可以非常从容的恢复信息.当然最好不要

[20141027]12c rman copy的分段备份.txt

[20141027]12c rman copy的分段备份.txt --12G rman下可以实现copy的分段备份,而11G下可以仅仅支持备份集的分段备份.做一个测试看看. --11G: SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ---------------------------------------

[20160904]表统计信息lock.txt

[20160904]表统计信息lock.txt 晚上看链接:https://blogs.oracle.com/Database4CN/entry/%E8%AF%8A%E6%96%AD%E7%BB%9F%E8%AE%A1%E4%BF%A1%E6%81%AF%E4%B8%8D%E6%94%B6%E9%9B%86%E5%8E%9F%E5%9B%A0 提到如果导入使用ROWS=n,会导致导入的表lock,测试看看: 官方有如下解释: If ROWS=n, then statistics for all