Temporal Validity

Temporal Validity는 valid time dimension을 테이블에 연결시킴으로써 시간 기준으로 해당 데이터의 유효한 지 여부에 따라 데이터를 보이게 하거나 보이지 않게 하는 Oracle Database 12c New Feature입니다.

Sample 테이블을 가지고 Temporal Validity를 실습해 보겠습니다. [PDB1]에서 진행합니다.

먼저 [PDB1]에 SYS 유저로 접속하여 실습 유저인 HR 소유의 테스트용 테이블을 생성합니다. 그런 다음 테스트 테이블에 valid time dimension을 추가합니다.

[oracle@New-Features-12c ~]$ sqlplus sys/oracle_4U@pdb1 as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Wed Sep 30 08:47:29 2015

Copyright (c) 1982, 2014, Oracle. All rights reserved.

Connected to:

Oracle Database 12c EE Extreme Perf Release 12.1.0.2.0 – 64bit Production

With the Partitioning, Oracle Label Security, OLAP, Advanced Analytics

and Real Application Testing options

SQL> create table hr.emp_temp as select employee_id,first_name,salary from hr.employees where rownum <= 10;

Table created.

SQL> alter table hr.emp_temp add period for valid_time;

Table altered.

valid time 관련 칼럼은 Describe 명령에서는 나타나지 않고 쿼리에서 해당 칼럼을 명시했을때만 나타납니다.

SQL> set lines 70

SQL> desc hr.emp_temp;

Name Null? Type

———————————– ——– ————————

EMPLOYEE_ID NUMBER(6)

FIRST_NAME VARCHAR2(20)

SALARY NUMBER(8,2)

테이블에 valid time dimension이 추가된 상태에서 valid-time 칼럼 값을 조회해 보겠습니다. 현재는 설정된 내용이 없습니다.

SQL> select first_name,

to_char(valid_time_start,’yyyy/mm/dd’) “Start”,

to_char(valid_time_end,’yyyy/mm/dd’) “End”

from hr.emp_temp;

FIRST_NAME Start End

——————– ———- ———-

Steven

Neena

Lex

Alexander

Bruce

David

Valli

Diana

Nancy

Daniel

10 rows selected.

이제 valid-time 칼럼 (valid_time_start, valid_time_end) 을 아래와 같이 업데이트하고 조회해 보겠습니다. valid-time 이 각 로우에 설정된 것을 알 수 있습니다.

SQL> update hr.emp_temp

set valid_time_start = to_date(‘1995/06/01′,’yyyy/mm/dd’), valid_time_end = to_date(‘2010/09/15′,’yyyy/mm/dd’)

where first_name in (‘Lex’,’Alexander’,’Bruce’,’David’,’Daniel’);

5 rows updated.

SQL> update hr.emp_temp

set valid_time_start = to_date(‘1999/08/01′,’yyyy/mm/dd’), valid_time_end = to_date(‘2012/03/01′,’yyyy/mm/dd’)

where first_name in (‘Steven’,’Diana’);

2 rows updated.

SQL> update hr.emp_temp

set valid_time_start = to_date(‘1998/03/20′,’yyyy/mm/dd’)

where first_name in (‘Neena’,’Nancy’,’Valli’);

3 rows updated.

SQL> commit;

Commit complete.

SQL> select first_name,

to_char(valid_time_start,’yyyy/mm/dd’) “Start”,

to_char(valid_time_end,’yyyy/mm/dd’) “End”

from hr.emp_temp

order by 2;

FIRST_NAME Start End

——————– ———- ———-

Bruce 1995/06/01 2010/09/15

David 1995/06/01 2010/09/15

Daniel 1995/06/01 2010/09/15

Alexander 1995/06/01 2010/09/15

Lex 1995/06/01 2010/09/15

Valli 1998/03/20

Nancy 1998/03/20

Neena 1998/03/20

Diana 1999/08/01 2012/03/01

Steven 1999/08/01 2012/03/01

10 rows selected.

이제 Flashback 쿼리를 이용해서 2011년 6월 1일 현재 유효한 데이터를 조회해 보겠습니다.

SQL> select first_name,

to_char(valid_time_start,’yyyy/mm/dd’) “Start”,

to_char(valid_time_end,’yyyy/mm/dd’) “End”

from hr.emp_temp

as of period for valid_time to_date(‘2011/06/01′,’yyyy/mm/dd’)

order by 2;

FIRST_NAME Start End

——————– ———- ———-

Valli 1998/03/20

Nancy 1998/03/20

Neena 1998/03/20

Diana 1999/08/01 2012/03/01

Steven 1999/08/01 2012/03/01

이번에는 1995년 9월 1일부터 1996년 9월 1일 사이 기간 동안 유효한 데이터를 VERSIONS … BETWEEN 구문을 이용해서 조회해 보겠습니다.

SQL> select first_name,

to_char(valid_time_start,’yyyy/mm/dd’) “Start”,

to_char(valid_time_end,’yyyy/mm/dd’) “End”

from hr.emp_temp

versions period for valid_time

between to_date(‘1995/09/01′,’yyyy/mm/dd’) and to_date(‘1996/09/01′,’yyyy/mm/dd’)

order by 2;

FIRST_NAME Start End

——————– ———- ———-

Lex 1995/06/01 2010/09/15

Alexander 1995/06/01 2010/09/15

Daniel 1995/06/01 2010/09/15

David 1995/06/01 2010/09/15

Bruce 1995/06/01 2010/09/15

이제 dbms_flashback_archive.enable_at_valid_time 프로시저를 이용해서 temporal support가 활성화된 테이블의 데이터을 visibility를 조정해 보겠습니다. 먼저 현재 유효한 데이터만 보이게 설정해서 확인해 봅니다.

SQL> exec dbms_flashback_archive.enable_at_valid_time(‘CURRENT’);

PL/SQL procedure successfully completed.

SQL> select first_name,

to_char(valid_time_start,’yyyy/mm/dd’) “Start”,

to_char(valid_time_end,’yyyy/mm/dd’) “End”

from hr.emp_temp

order by 2;

FIRST_NAME Start End

——————– ———- ———-

Neena 1998/03/20

Nancy 1998/03/20

Valli 1998/03/20

모든 데이터가 보이도록 변경하고 이를 확인합니다.

SQL> exec dbms_flashback_archive.enable_at_valid_time(‘ALL’);

PL/SQL procedure successfully completed.

SQL> select first_name,

to_char(valid_time_start,’yyyy/mm/dd’) “Start”,

to_char(valid_time_end,’yyyy/mm/dd’) “End”

from hr.emp_temp

order by 2;

FIRST_NAME Start End

——————– ———- ———-

Bruce 1995/06/01 2010/09/15

David 1995/06/01 2010/09/15

Daniel 1995/06/01 2010/09/15

Alexander 1995/06/01 2010/09/15

Lex 1995/06/01 2010/09/15

Valli 1998/03/20

Nancy 1998/03/20

Neena 1998/03/20

Diana 1999/08/01 2012/03/01

Steven 1999/08/01 2012/03/01

10 rows selected.

SQL> exit

Disconnected from Oracle Database 12c EE Extreme Perf Release 12.1.0.2.0 – 64bit Production

With the Partitioning, Oracle Label Security, OLAP, Advanced Analytics

and Real Application Testing options

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

One thought on “Temporal Validity Oracle 12c”
  1. Hello there,

    My name is George and I’d like to know if you would have some interest to have your website here at epac.to promoted as a resource on our blog georgemartjr.com ?

    We are updating our broken link resources to include current and up to date resources for our readers. Our resource links are manually approved allowing us to mark a link as a do-follow link as well
    .
    If you may be interested please in being included as a resource on our blog, please let me know.

    Thanks,
    George

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다