Nouveautés SQL Oracle 12c : CREATE TABLE, ALTER TABLE et plus

Dans notre série sur les nouveautés de la version 12c, en voici aujourd’hui qui concernent plus particulièrement le code SQL et  j’ai trouvé intéressant de vous parler des deux commandes plus qu’essentielles lors de l’utilisation de la base de données, les commandes  CREATE TABLE  et ALTER TABLE et le typage des colonnes associées.
Les nouveautés dans le domaine déclaratif SQL  sont :
–          La taille maximale des trois types VARCHAR2, NVARCHAR2 et RAW est désormais de 32767 bytes, à condition de définir le paramètre d’initialisation de la base MAX_ STRING_SIZE comme suit :

  • MAX_STRING_SIZE = STANDARD (valeur par défaut) : la taille limite dans la base de données Oracle 12c sera 4000 octets pour VARCHAR2 et NVARCHAR2 et 2000 octets pour RAW;
  • MAX_STRING_SIZE = EXTENDED : la taille limite sera 32767 octets pour les types VARCHAR2,  NVARCHAR2 et RAW.

–          La possibilité de spécifier la valeur par défaut d’une colonne (DEFAULT Value) en utilisant les pseudos colonnes utilisées pour les séquenceurs CURRVAL et NEXTVAL (tant que la séquence existe et que vous avez les droits nécessaires pour accéder au séquenceur), exemple :

create sequence id_seq start with 1 increment by 1 nocache;
CREATE TABLE test_seq
(
    test_seq_id integer NOT NULL default id_seq.nextval,
…)

–          On peut ajouter à la clause DEFAULT le terme ON NULL, ce qui indique qu’on attribue une valeur de colonne par défaut spécifiée quand une instruction INSERT tente d’assigner une valeur qui est « évaluée » à NULL, exemple :

CREATE TABLE myemp
(employee_id number,
last_name varchar2(25),
department_id NUMBER DEFAULT ON NULL 50 NOT NULL);
INSERT INTO myemp (employee_id, last_name) values (1,’Test’) ;
SELECT employee_id, last_name, department_id FROM myemp WHERE employee_id = 1 ;
EMPLOYEE_ID LAST_NAME                 DEPARTMENT_ID
----------- ------------------------- -------------
1           Test                        50

–          Comme pour d’autres moteurs de base de données on peut enfin spécifier une colonne (IDENTITY) à laquelle est affectée une valeur qui s’incrémente ou se décrémente en utilisant un séquenceur généré dans la commande :

  • La table T1 est créée avec une colonne IDENTITY,  un séquenceur est automatiquement généré avec un incrémentant de 1 par défaut  :
    • CREATE TABLE T1 (id NUMBER GENERATED AS IDENTITY);
  • La table T1 est créée avec une  colonne IDENTITY, avec un séquenceur automatiquement généré débutant à la valeur 100 avec un incrément de 10 :
    • CREATE TABLE t2 (id NUMBER GENERATED BY DEFAULT AS IDENTITY (START WITH 100 INCREMENT BY 10));

–          On peut rendre  une colonne VISIBLE (valeur par défaut) ou INVISIBLE. Une requête de type « SELECT * » ne permet pas de consulter les colonnes invisibles, il faut les spécifier dans la requête nominativement, de même la commande DESCRIBE sur la table ne ramène pas d’informations sur la colonne invisible à moins d’utiliser le paramètre COLINVISIBLE de SQL*Plus. L’information sur les colonnes invisibles est visible  dans la vue USER_TAB_COLUMNS
–          Dans Oracle 11g, certaines commandes de langage de définition de données (DDL) requièrent des verrous impliquant le blocage des opérations de manipulation de données (DML), avec la nouvelle version 12c, il y a l’ajout du terme « ONLINE » sur les commande DDL pour éviter tout blocage :

  • Suppression d’index : DROP INDEX … ONLINE
  • Marquer un index UNUSED : ALTER INDEX … UNUSABLE ONLINE
  • Marquer une colonne UNUSED : ALTER TABLE …SET UNUSED … ONLINE
  • Supprimer une contrainte : ALTER TABLE … DROP … ONLINE
  • Move une partition d’une table : ALTER TABLE … MOVE PARTITION … ONLINE

Restez attentif nous continuerons de vous apporter régulièrement lors des prochaines semaines, les éléments que nous avons trouvé intéressants lors de nos tests sur cette nouvelle mouture d’Oracle.

1 réflexion sur “Nouveautés SQL Oracle 12c : CREATE TABLE, ALTER TABLE et plus”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *