CREATE TYPE

Name

CREATE TYPE  --  définit un nouveau type

Synopsis

CREATE TYPE typename ( INPUT = input_function, OUTPUT = output_function
      , INTERNALLENGTH = { internallength | VARIABLE }
    [ , EXTERNALLENGTH = { externallength | VARIABLE } ]
    [ , DEFAULT = default ]
    [ , ELEMENT = element ] [ , DELIMITER = delimiter ]
    [ , SEND = send_function ] [ , RECEIVE = receive_function ]
    [ , PASSEDBYVALUE ]
    [ , ALIGNMENT = alignment ]
    [ , STORAGE = storage ]
)
  

Entrées

typename

nom du type à créer.

internallength

valeur littérale, qui spécifie la longueur interne du nouveau type.

externallength

valeur littérale, qui spécifie la longueur externe (affichée) du nouveau type.

input_function

nom de la fonction, créée par CREATE FUNCTION, qui converti la donnée depuis la forme externe vers la forme interne du type.

output_function

nom d'une fonction, créée par CREATE FUNCTION, qui convertit la donnée depuis sa forme interne vers une forme correcte à l'affichage.

element

le type créé est un tableau; spécifie le type des éléments du tableau.

delimiter

Le caractère délimiteur à utiliser entre les valeurs dans les tableaux.

default

La valeur par défaut pour le type. Habituellement il est omis, donc sa valeur par défaut est NULL.

send_function

nom d'une fonction, créée par CREATE FUNCTION, qui convertit la donnée de ce type en une forme appropriée pour la transmission vers une autre machine.

receive_function

nom d'une fonction, créée par CREATE FUNCTION, qui convertit la donnée de ce type en une forme appropriée pour la transmission depuis une autre machine vers une forme interne.

alignment

Condition d'alignement de stockage pour le type. Si spécifié, doit être char, int2, int4, ou double; par défaut c'est int4.

storage

Stockage technique pour le type. Si spécifié, doit être plain, external, extended, ou main; par défaut c'est plain.

Sorties

CREATE

message retourné si le type a été créé correctement.

Description

CREATE TYPE permet à l'utilisateur d'enregistrer un nouveau type utilisateur avec Postgres pour l'utiliser dans la base. L'utilisateur qui définit un type en devient propriétaire. typename est le nom du nouveau type et doit être unique dans les types définis dans la base.

CREATE TYPE nécessite l'enregistrement de deux fonctions (en utilisant create function) avant de définir le type. La représentation d'un nouveau type base est déterminée par input_function, qui convertit la représentation du type externe en une représentation interne utilisable par les opérateurs et les fonctions définies pour le type. Naturellement, output_function produit la tranformation inverse. Les deux fonctions entrée et sortie doivent être déclarées pour prendre un ou deux arguments de type "opaque" ou prenant trois arguments de types opaque, OID, int4. (Le premier argument est une entrée texte comme une chaîne C, le second argument est un élément du type dans le cas d'un type tableau, et le troisième est le type de modèle de la colonne des destination, si connue). La fonction sortie peut être déclarée comme prenant un argument de type opaque, ou prenant deux arguments de types opaque, OID. (Le premier argument est actuellement le type lui-même, mais depuis que la fonction sortie doit être déclarée en premier, il est plus facile de la déclarer comme acceptant le type opaque. Le second argument est de nouveau l'élément de type tableau pour les types tableau).

Les nouveaux types base peuvent être de longueur fixe, auquel cas internallength est un entier positif, ou une longueur variable, indiqué en plaçant internallength à VARIABLE. (En interne, ceci est représenté en plaçant les types à -1.) La représentation interne de tous les types de longueur variable doit commencer avec un entier donnant la longueur totale de la valeur du type.

La représentation externe est spécifiée de façon similaire en utilisant le mot-clé externallength (cette vakeur n'est actuellement pas utilisée, et est omise, laissant par défaut l'option VARIABLE.)

Pour indiquer qu'un type est un tableau spécifiez le type des éléments du tableau en utilisant le mot-clé ELEMENT. Par exemple, pour définir un tableau d'entiers de 4 octets ("int4"), spécifiez

ELEMENT = int4
Pour plus de détails sur les types tableau voir plus bas.

Pour indiquer le délimiteur à utiliser entre les valeurs dans la représentation externe des tableaux de ce type, delimiter peut être placé comme caractère spécifique. Le délimiteur par défaut est la virgule (','). Notez que le délimiteur est associé à l'élément type de tableau, pas le type tableau lui-même.

Une valeur par défaut est optionnellement disponible dans le cas où l'utilisateur désire des colonnes de type par défaut autre que NULL. Spécifiez la valeur avec le mot-clé DEFAULT. (Une valeur par défaut peut être remplacée par une clause explicite DEFAULT attachée à une colonne particulière).

Les arguments optionnels send_function et receive_function ne sont pas habituellement utilisés, et sont omis (admettant par défaut output_function et input_function respectivement). Ces fonctions peuvent être parfois ressuscitées pour les utiliser en spécifiant des représentations binaires indépendantes de la machine.

Le flag optionnel, PASSEDBYVALUE, indique que les opérateurs et les fonctions qui utilisent ce type seront passés en argument par valeur plus que par référence. Notez que vous ne pouvez pas passer par des valeurs de types dont la représentation interne est plus longue que la largeur du type Datum (4 octets sur la plupart des machines, 8 sur quelques unes).

Le mot-clé alignment spécifie l'alignement de stockage nécessité pour le type. Les valeurs admises sont alignées sur des limites de 1, 2, 4, ou 8 octets. Notez que les types de longueur variable doivent avoir un alignement d'au moins 4, car ils contiennent nécessairement un int4 comme premier composant.

Le mot-clé storage admet la sélection de stratégies de stockage pour les types de longueur variables (seul plainest admis comme type de longueur fixe). plain désactive TOAST pour le type : il sera toujours stocké en-ligne et non compressé. extended donne toutes les possibilités TOAST : le système essaiera d'abord de compresser une valeur longue, et déplacera la valeur de sortie de la ligne de la table principale si elle est toujours trop longue. external permet à la valeur d'être déplacée à l'extérieur de la table principale, mais le système essaiera pas de la compresser. main admet la compression, mais décourage le déplacement de la valeur à l'extérieur de la table principale. (Les données avec cette méthode de stockage peuvent toujours être déplacées à l'extérieur de la table principale s'il n'y a pas d'autre moyen de faire un ajustement de ligne, mais elles seront conservées dans la table principale de préférence sur des items extended et external).

Array Types

Chaque fois qu'un type-utilisateur est créé, PostgreSQL crée automatiquement un type tableau associé, dont le nom consiste en nom de type de la base initialisé avec un souligné. L'analyseur comprend cette convention de nommage, et traduit les questions des colonnes de type foo[] en questions de type _foo. Le type de tableau implicitement créé est une longueur variable et utilise les fonctions entrée et sortie natives array_in et array_out.

Vous pourrez raisonnablement vous demander "pourquoi y'a-t-il une option ELEMENT si le système prend le type tableau correct automatiquement ?" Le seul cas où il utile d'uiliser ELEMENT est quand vous avez créé un type de longueur fixe qui apparaît être en interne un tableau de N choses identiques, et quand vous voulez que les N choses soient accédées directement par indiçage, en plus de toutes les opérations que vous projetez de fournir pour le type dans son ensemble. Par exemple, le type name permet que son constituant char soit accédé de cette façon. Un type point 2-D peut permettre à ses deux composants décimaux d'être accédés comme point[0] et point[1]. Notez que cette facilité ne fonctionne que pour les types de longueur fixe dont la forme interne est une séquence exacte de N champs identiques. Un type de longueur variable indiçable doit avoir une représentation interne généralisée utilisée par array_in et array_out. Pour des raisons historiques (i.e, c'est tout à fait faux, mais trop tard pour changer), l'indiçage de type tableau de longueur fixe démarre de zero, plus que de un comme les tableaux de longueur variable.

Notes

Les noms de types-utilisateurs ne peuvent débuter par un caractère de soulignement ("_") et ne peuvent être que de 30 caractères de longueur (ou en général NAMEDATALEN-2, plus que les caractères NAMEDATALEN-1 admis pour d'autres noms). Les noms de types débutant avec un souligné sont réservés pour les noms de type tableau natifs.

Exemples

Cet exemple crée le type box et utilise celui-ci dans une définition de table :

CREATE TYPE box (INTERNALLENGTH = 16,
    INPUT = my_procedure_1, OUTPUT = my_procedure_2);
CREATE TABLE myboxes (id INT4, description box);

Si la struicture interne de box est un tableau de quatre float4 nous pouvons dire :

CREATE TYPE box (INTERNALLENGTH = 16,
    INPUT = my_procedure_1, OUTPUT = my_procedure_2,
    ELEMENT = float4);
qui permettra aux composants décimaux d'une valeur box d'être accédés par indiçage. Sinon le type devient le même que précédemment.

Cet exemple crée un type objet-large et l'utilise dans une définition de table :

CREATE TYPE bigobj (INPUT = lo_filein, OUTPUT = lo_fileout,
    INTERNALLENGTH = VARIABLE);
CREATE TABLE big_objs (id int4, obj bigobj);

Compatibilité

Cette commande CREATE TYPE est une extension PostgreSQL. Il existe une instruction CREATE TYPE en SQL99 qui est différente dans le détail.

Voir aussi

CREATE FUNCTION, DROP TYPE , Guide du programmeur PostgreSQL.