La version 12c de oracle Database a introduit une fonctionnalité intéressante vis à vis des données dites d'archives. Il est en effet courant de stocker des milliers, voir des millions de lignes dans des tables et qui ne sont jamais ou très peu utilisées. Ceci peut être particulièrement gênant dans le cas d'une recherche où seules les informations récentes sont souhaitées.

Pour palier à ceci il est fréquent de positionner dans la table un flag disant que l'on prend en compte la ligne ou pas. La fonction In-Database Archiving ou IDA gère ceci de manière plus souple.

Soit la table suivante :

create table personne ( code char(2), prenom char(15), constraint personne_pk primay key ( code));
insert into personne values ('01','Alice');
insert into personne values ('02','Bob');
insert into personne values ('03','Carmen');
commit;

Ici la ligne 03 - Carmen va être jugée non pertinente pour les recherches. Dans le concept IDA les données sont déclarées soit actives, soit archivées. Une donnée marquée archivée devient invisible pour l'application et est stockée sous forme compressée. L'activation est simple soit à la création de la table:

create table personne ( code char(2), prenom char(15), constraint client_pk primary key (code)) row archival;

Soit à postériori

alter table personne row archival;

La commande suivante désactive ce mode

alter table personne no row archival;

L'activation ajoute une colonne de plus à la table (ORA_ARCHIVE_STATE ) . Cette colonne n'est toutefois pas visible par la commande DESC, il faut interroger la table USER_TAB_COLS.

SELECT column_id, column_name, data_type, data_length, hidden_column
FROM   user_tab_cols
WHERE  table_name = 'PERSONNE'
ORDER BY column_id

 COLUMN_ID COLUMN_NAME		DATA_TYPE	     DATA_LENGTH HIDDEN_CO
---------- -------------------- -------------------- ----------- ---------
	 1 CODE 		CHAR			       2 NO
	 2 PRENOM		CHAR			      15 NO
	   SYS_NC00003$ 	RAW			     126 YES
	   ORA_ARCHIVE_STATE	VARCHAR2		    4000 YES

Par défaut la valeur de ORA_ARCHIVE_STATE est à "0"

select ora_archive_state, count(*) from personne group by ora_archive_state;

ORA   COUNT(*)
--- ----------
0	     3

L'exemple suivant présente la fonctionnalité.

select * from personne;

CODE   PRENOM
------ ---------------------------------------------
01     Alice
02     Bob
03     Carmen

Il peut au premier abord évident d'utiliser ceci pour archiver la ligne code = '03' par exemple : update personne set ora_archive_state='1' where code='03'; Il est conseillé toutefois de ne pas utiliser un update simple comme ici mais de passer par le package. dbms_ilm et la fonction archivestatename.

update personne set ora_archive_state=dbms_ilm.archivestatename(1) where code='03';
commit;
select * from personne;

CODE   PRENOM
------ ---------------------------------------------
01     Alice
02     Bob

select ora_archive_state, count(*) from personne group by ora_archive_state;

ORA_ARCHIVE_STATE  COUNT(*)
-----------------  --------
1	                 1
0	                 2

Pour voir les lignes archivées il faut demander la visibilité de toutes les lignes

alter session set row archival visibility=all;
select * from personne;

CODE   PRENOM
------ ---------------------------------------------
01     Alice
02     Bob
03     Carmen

Si on souhaite modifier l'état pour la ligne code '03' il faut au préalable activer la visibilité. La commande suivante réactive l'invisibilité des lignes archivées.

alter session set row archival visibility=active;
select * from personne;

CODE   PRENOM
------ ---------------------------------------------
01     Alice
02     Bob

Attention cette fonctionnalité ne fonctionne que sur le bases non-CDB en 12.1, par contre elle est étendue au CDB en version 12.2.