Les types de données sous ORACLE Par défaut, les types de données du tableau 1 (classés par ordre alphabétique) sont pris en charge par Oracle8 et peuvent être utilisés dans la définition d'une table. Types de données pris en charge par Oracle8 Texte de données Description Taille maximale des colonnes et valeurs par défaut BFILE Données binaires, enregistrées dans un fichier externe. Jusqu'à 4 Go. BLOB Données binaires, conservées dans la base de données. Jusqu'à 4 Go. CHAR (n) Chaîne de caractères de longueur fixe n. Chaque ligne contient n caractères ; la valeur par défaut est 1 ; la taille maximale est 2 000. Les colonnes plus courtes sont remplies avec des espaces. CLOB Données de jeux de caractères (singlebyte). Jusqu'à 4 Go. DATE Date et heure, avec la plage de valeurs de 1.1.4712 av. J.C. à 31.12.4712 ap. J.C. Toujours 7 octets. NLS_DATE_FORMAT est le format standard. Par défaut, l'heure n'est pas affichée. LONG Données de jeux de caractères de longueur variable (forme ancienne de CLOB, mais toujours utile car elle peut être mise en oeuvre directement) Jusqu'à 2 Go. LONG RAW Données binaires de longueur variable (forme ancienne de BLOB, mais toujours utile car elle peut être mise en oeuvre directement). Jusqu'à 2 Go. NCHAR (n) Chaîne de caractères enregistrée dans le jeu de caractères national, de longueur fixe. Voir CHAR. NCLOB Chaîne de caractères Voir CLOB. enregistrée dans le jeu de caractères national. NUMBER (v, n) Données numériques de longueur variable, dont les positions avant la virgule sont définies avec v et celles après la virgule, avec n. L'espace disque requis varie d'une ligne à l'autre, selon la valeur devant être enregistrée. L'espace disque maximal est de 21 octets. NVARCHAR2 (n) Chaîne de caractères enregistrée dans le jeu de caractères national, de longueur variable. Voir VARCHAR2. RAW (n) Données binaires, dont la taille maximale doit être spécifiée. L'espace disque par ligne est variable. La longueur maximale doit être spécifiée et ne peut excéder 2 000. ROWID Données binaires représentant l'adresse d'une ligne. Valeur fixe de 10 octets pour ROWID normal. VARCHAR2 (n) Chaîne de caractères de longueur variable qui enregistre les données de jeux de caractères. Longueur variable par ligne, au maximum de 4 000 octets. Elle doit être spécifiée. I - LES CHAINES DE CARACTERES CHAR Lors de la création d'une table est défini le nombre maximal de caractères pouvant être enregistrés. La valeur par défaut est 1, la valeur maximale est 2 000 (255 sous Oracle7). Dans les colonnes de ce type de données, Oracle s'assure que toutes les valeurs enregistrées présentent cette longueur (le cas échéant, des espaces sont ajoutés pour atteindre la longueur définie) et n'autorise pas l'enregistrement des valeurs plus longues (en cas de tentative, un message d'erreur est affiché si ce ne sont pas uniquement des espaces qui excèdent la longueur définie, car seuls ces caractères peuvent être tronqués). Les données d'une ligne CHAR sont enregistrées dans le jeu de caractères de la base de données. Padded comparison L'une des principales caractéristiques des lignes CHAR est que la longueur totale joue un rôle dans les comparaisons, les espaces étant pris en compte. Si, par exemple, « ANNE » est enregistré dans un champ CHAR(6), deux espaces sont ajoutés. Si l'on essaie de comparer cette colonne avec le littéral ANNE, on obtient une inégalité, car le littéral ne contient aucun espace ! C'est la raison pour laquelle il faut mettre en oeuvre une fonction appropriée (RPAD) pour pouvoir comparer les valeurs. VARCHAR2 Les colonnes VARCHAR2 permettent l'enregistrement des chaînes de caractères de longueur variable, les données étant enregistrées dans le jeu de caractères de la base de données et la longueur maximale étant de 4 000 signes. Une longueur doit être spécifiée dans la définition. VARCHAR Il existe actuellement le type de données VARCHAR, équivalent à VARCHAR2. Mais sa définition pouvant changer ultérieurement, ce type de données ne devrait pas encore être utilisé. NCHAR et NVARCHAR2 Les types de données NCHAR et NVACHAR2, apparus sous Oracle8, correspondent dans leur définition aux types de données CHAR et VARCHAR2. La seule différence est que les types de données N enregistrent les données de caractères dans le jeu de caractères national, et non dans celui de la base de données. De cette manière, les données de la base de données peuvent être enregistrées dans deux jeux de caractères différents si cela est nécessaire. CLOB et NCLOB Pour enregistrer les grands volumes de données de jeux de caractères, on dispose des types de données CLOB et NCLOB, qui peuvent accueillir chacun jusqu'à 4 Go de données par ligne. L'inconvénient présenté par ces types de données réside dans le fait que leur utilisation requiert la mise en oeuvre d'un package dédié au traitement des données. Restrictions liées à l'utilisation de LONG Les colonnes LONG acceptent les données de jeux de caractères d'une taille allant jusqu'à 2 Go. Contrairement aux données LOB, elles ont l'avantage de pouvoir être utilisées directement dans les instructions SELECT, UPDATE et INSERT. Elles ne sont toutefois pas exemptes d'inconvénients : leur traitement est limité au langage PL/SQL (c'est-à-dire à environ 32 Ko), les champs LONG ne peuvent pas être répliqués et ne sont pas accessibles via des liens de base de données. Il est donc préférable d'avoir recours au type de données CLOB (ou NCLOB, le cas échéant). Sous Oracle, les champs LONG sont utilisés, par exemple, dans le dictionnaire de données pour enregistrer les définitions de vues ou de codes PL/SQL. II - LES DONNEES NUMERIQUES Présentation Toutes les données numériques sont exécutées par l'intermédiaire d'un type de données : NUMBER. Définition des positions La définition des positions avant et après la virgule (Precision et Scale) permet l'enregistrement des nombres les plus divers. Trente-huit positions significatives répondent également aux applications technico-scientifiques. Du fait de l'utilisation de Precision et Scale, le format de sortie peut être défini, et les entrées vérifiées et, le cas échéant, modifiées ou refusées, comme l'illustre le tableau 2. On y lira également les conséquences d'un scale négatif. (La valeur par défaut est toujours 1234567,89.) Nombre Scale Résultat après SELECT 5, 2 Erreur ORA-01438, car le nombre est trop grand pour le format de numéro. 8, 0 1 234 568 (arrondi automatiquement) 10, –2 1 234 600 (arrondi à 100 = –2) 9, 2 1 234 567,89 12, 4 1 234 567,89 Format variable Comme le montre le tableau 1, Oracle enregistre les valeurs numériques dans un format variable, 21 octets au maximum étant utilisés. Dans les tables qui doivent enregistrer des nombres très différents au sein d'une même colonne, il faut éventuellement procéder à une modification de l'espace disque requis dans la définition de la table. III - LES DONNEES BINAIRES Présentation Les types de données BLOB, CLOB et NCLOB, ainsi que LONG et VARCHAR2 en ce qui concerne les données de chaînes de caractères ont déjà été évoqués. Pour ce qui est de l'enregistrement des données binaires, on trouve les types de données BLOB et BFILE ainsi que RAW et LONG RAW. BLOB et BFILE Le type de données BLOB enregistre les données binaires jusqu'à une taille maximale de 4 Go, les données étant enregistrées dans la base de données. Comme pour le type CLOB, le traitement des données ne peut généralement pas se faire par SQL, mais requiert un pachage approprié. Fichiers externes Pour l'essentiel, BFILE est identique à BLOB, excepté le fait que les données ne sont pas enregistrées dans la base de données, mais dans un fichier externe, auquel renvoie le pointeur dans BFILE. Principale restriction : les données enregistrées en BFILE sont protégées en écriture vis-à-vis de la base de données. Elles ne peuvent donc pas être modifiées par les commandes de cette dernière, mais seulement via une manipulation externe du fichier auquel renvoie le pointeur. C'est également la raison pour laquelle les données BFILE ne prennent pas part aux transactions. RAW RAW est le type de données équivalent à VARCHAR2 pour l'enregistrement des données autres que celles de jeux de caractères. Mais contrairement à VARCHAR2, RAW ne peut excéder une valeur maximale de 2 000 (contre 4 000 pour VARCHAR2). LONG RAW La forme équivalente de LONG, pour l'enregistrement des données binaires, est LONG RAW. Les mêmes restrictions que pour LONG s'appliquent. Le type de données à utiliser à la place de LONG RAW est BLOB ou, le cas échéant, BFILE. ROWID (UROWID) On entend par ROWID l'identification créée automatiquement pour les lignes qu'Oracle propose sous la forme d'une pseudo-colonne dans chaque table. Le type de données ROWID permet d'enregistrer dans une colonne d'une autre table les ROWID lus dans une pseudo-colonne (bien que cela puisse poser d'importants problèmes d'intégrité au fil du temps). Outre les ROWID Oracle8 (qui contiennent également des informations sur les tables partitionnées, par exemple), les ROWID restreints sont également pris en charge (pour des raisons de compatibilité avec les versions précédentes d'Oracle). IV - LES AUTRES TYPES DE DONNEES DATE Le type de données DATE est prévu pour l'enregistrement des données de date et d'heure, celui-ci se faisant en interne dans une valeur. Chaque valeur de date contient donc une indication de l'heure, et chaque indication d'heure se réfère toujours à une date. En plus de l'année, on enregistre également le siècle. Le passage à l'an 2000 n'a donc pas posé de problème en principe. « Ère » et indications de date Les indications de date sont enregistrées dans la période allant de 1.1.4712 BCE à 31.12.4712 CE, où CE correspond à « Common Era » (après Jésus-Christ) et BCE à « Before Common Era » (avant Jésus-Christ). Oracle peut, bien sûr, être utilisé dans des régions où les références temporelles sont différentes. Les indications de date et d'heure sont enregistrées en interne, dans un format spécial de 7 octets. Format de date Par défaut, la date est saisie et éditée conformément au NLS_DATE_FORMAT. Oracle prend également en charge le passage du calendrier julien en calendrier grégorien. Heure Il est important de noter qu'une indication de date est normalement toujours enregistrée avec l'indication de l'heure. Si, par exemple, une valeur de date est créée avec SYSDATE, la ligne ne contient pas seulement la date, mais aussi l'heure à laquelle la fonction est appelée. Si SYSDATE est de nouveau enregistré quelques instants plus tard, les valeurs de la ligne s'en trouvent bien sûr modifiées, car les données correspondant à l'heure ont changé. Il n'est donc pas possible de placer une clé primaire (PRIMARY KEY) ayant SYSDATE comme valeur par défaut dans une colonne de date : si une ligne est insérée exactement à la même date et à la même heure, un conflit de clé pourrait survenir.