FirebirdSQL logo
 DOMAININDEX 

Format de fichier externe

La table externe est au format rows' avec une longueur fixe.Il n’y a pas de séparateurs de champs : les limites des champs et des lignes sont définies par la taille maximale en octets de chaque définition de champ.Il faut en tenir compte tant lors de la définition de la structure d’une table externe que lors de la conception d’un fichier d’entrée pour une table externe dans laquelle des données d’une autre application doivent être importées.Par exemple, le format répandu ".csv'", ne peut pas être utilisé comme fichier d’entrée, et ne peut pas être reçu directement comme fichier externe.

Le type de données le plus utile pour les colonnes de tables externes est CHAR avec une longueur fixe. La longueur doit correspondre aux données que vous souhaitez manipuler.Les types numériques et les dates peuvent facilement être convertis en eux, et les lignes sont produites telles quelles, alors que si les données ne sont pas lues par une autre base de données Firebird, les types natifs peuvent être méconnaissables pour les applications externes et être "abracadabra" pour elles.

Bien sûr, il existe des moyens de manipuler les types de données pour créer des fichiers de sortie de Firebird qui peuvent être lus directement comme fichiers d’entrée dans d’autres applications, en utilisant des procédures stockées avec ou sans utilisation de tables externes.La description de ces méthodes dépasse le cadre de ce manuel.Nous ne donnerons ici que quelques directives et conseils pour créer et travailler avec des fichiers texte simples, car une table externe est souvent utilisée comme moyen simple de créer ou de lire un journal indépendant des transactions.Ces fichiers peuvent être lus hors ligne avec un éditeur de texte ou une application d’audit.

Séparateur de ligne

En général, les fichiers externes sont plus pratiques si les lignes sont séparées par un délimiteur, comme une séquence de "nouvelle ligne" qui peut être reconnue par une application sur la plate-forme prévue.Pour Windows, il s’agit d’une séquence de deux octets "CRLF", d’un retour chariot (code ASCII 13) et d’un saut de ligne (code ASCII 10).Pour POSIX — LF est généralement autonome, dans certaines applications macOS X il peut s’agir de LFCR.Il existe plusieurs façons de remplir automatiquement la colonne du séparateur.Dans notre exemple, nous utilisons le trigger BEFORE INSERT et la fonction intégrée ASCII_CHAR.

Exemples d’utilisation de tables externes

Dans notre exemple, nous allons définir une table d’enregistrement externe qui peut être utilisée dans le gestionnaire d’exception d’une procédure stockée ou d’un déclencheur.La table externe est choisie parce que les messages de toute exception traitée seront stockés dans le journal, même si la transaction dans laquelle le processus a été exécuté est annulée en raison d’une autre exception non traitée.À des fins de démonstration, notre tableau ne contient que deux colonnes : un horodatage et un message texte.La troisième colonne stocke le séparateur de ligne :

CREATE TABLE ext_log
EXTERNAL FILE 'd:\externals\log_me.txt' (
   stamp   CHAR(24),
   message CHAR(100),
   crlf    CHAR(2) -- Pour Windows
);

COMMIT;

Créez maintenant un déclencheur pour enregistrer automatiquement l’horodatage et le séparateur de ligne chaque fois qu’un message est écrit dans la table :

SET TERM ^;
CREATE TRIGGER bi_ext_log FOR ext_log
ACTIVE BEFORE INSERT
AS
BEGIN
  IF (NEW.stamp IS NULL) THEN
    NEW.stamp = CAST (CURRENT_TIMESTAMP AS CHAR(24));
  NEW.crlf = ASCII_CHAR(13) || ASCII_CHAR(10);
END ^
COMMIT ^
SET TERM ;^

Insertion de certaines entrées (cela peut être fait dans un gestionnaire d’exception)

INSERT INTO ext_log (message)
VALUES('Shall I compare thee to a summer''s day?');
INSERT INTO ext_log (message)
VALUES('Thou art more lovely and more temperate');

Contenu du fichier externe:

2015-10-07 15:19:03.4110Shall I compare thee to a summer's day?
2015-10-07 15:19:58.7600Thou art more lovely and more temperate

Restriction NOT NULL

Par défaut, la colonne peut accepter la valeur NULL.

La clause facultative NOT NULL indique que la colonne ne peut pas être affectée d’une valeur NULL.