Documentation PostgreSQL 8.1.23 > Programmation serveur > Extension de SQL > Système de typage de PostgreSQL | |
Extension de SQL | Fonctions définies par l'utilisateur |
Les types de données de PostgreSQL™ sont répartis en types de base, types composé, types de domaine et pseudo-types.
Les types de base sont ceux implémentés avant le langage SQL comme int4 (typiquement dans un langage de bas niveau comme le C). Ils correspondent généralement à ce qu'on nomme les types de données abstraits. PostgreSQL™ peut opérer avec de tels types seulement au travers de fonctions apportées par l'utilisateur et comprend uniquement le comportement de tels types par la description qu'en a fait l'utilisateur. Les types de base sont ensuite sous-divisés en types scalaires et tableaux. Pour chaque type scalaire, un type de tableau correspondant est automatiquement créé, pouvant contenir des tableaux à la taille des variables de ce type scalaire.
Les types composés, ou types lignes, sont créés lorsqu'un utilisateur crée une table. Il est aussi possible d'utiliser CREATE TYPE pour définir un type composé « autonome », donc non associé à une table. Un type composé est simplement une liste de types avec des noms de champ associés. Une valeur pour un type composé est une ligne ou un enregistrement de valeurs de champ. L'utilisateur peut accéder aux champs composant à partir de requêtes SQL. Référez-vous à la Section 8.11, « Types composites » pour plus d'informations sur les types composé.
Un domaine est basé sur un type de base particulier et est interchangeable pour de nombreux buts avec son type de base. Néanmoins, un domaine pourrait avoir des contraintes restreignant ses valeurs valides à un sous-ensemble du type de base de départ.
Les domaines peuvent être créés avec les commandes SQL CREATE DOMAIN. Leur création et utilisation ne sont pas discutées dans ce chapitre.
Il existe quelques « pseudo-types » pour certains buts très spécifiques. Les pseudo-types ne peuvent pas apparaître comme colonnes de tables ou d'attributs de types composés, mais peuvent être utilisés pour déclarer les types d'argument ou de résultat de fonctions. Cela fournit un mécanisme à l'intérieur du système de types pour identifier les classes spéciales de fonctions. Le Tableau 8.20, « Pseudo-Types » liste les pseudos-types existants.
Deux pseudo-types d'un grand intérêt sont anyelement et anyarray, collectivement appelés des types polymorphiques. Toute fonction déclarée utilisant ces types est dite être une fonction polymorphique. Une fonction polymorphique peut opérer sur différents types de données, les types de données spécifiques étant déterminés par les types de données réellement passés lors d'un appel particulier.
Les arguments et résultats polymorphiques sont liés les uns aux autres et sont modifiés en un type spécifique de données lorsqu'une requête appelant une fonction polymorphique est analysée. Chaque position (argument ou valeur de retour) déclarée en tant que anyelement est autorisée à avoir tout type de donnée spécifique mais, sur un seul appel, elles doivent toutes avoir le même type. Chaque position déclarée comme anyarray peut avoir n'importe quel type de données mais, de façon similaire, elles doivent toutes avoir le même type. Si des positions sont déclarées anyarray et d'autres anyelement, le type de tableau réel dans les positions anyarray doit être un tableau dont les éléments sont du même type que ceux des positions anyelement.
Du coup, lorsque plus d'un argument est déclaré polymorphique, l'effet est que seules certaines combinaisons de types d'argument sont autorisées. Par exemple, une fonction déclarée de cette façon equal(anyelement, anyelement) prendra seulement deux valeurs en entrées, à condition qu'elles soient du même type.
Lorsque la valeur de retour d'une fonction est déclarée polymorphique, il doit exister au moins un argument lui-aussi polymorphique et le type de données fourni en argument détermine le type de données du code de retour pour cet appel. Par exemple, s'il n'existait pas déjà un mécanisme d'abonnement d'un tableau, nous pourrions définir une fonction qui implémente cet abonnement avec subscript(anyarray, integer) returns anyelement. Cette déclaration contraint le premier argument à être de type tableau et permet à l'analyseur d'inférer le bon type de retour à partir du type du premier argument.