Blog Navicat

Extension des types de données PostgreSQL avec Navicat 17 - Partie 2 Jan 3, 2025 by Robert Gravelle

Types composites

Bienvenue dans le deuxième volet de cette série sur la création de types de données personnalisés dans PostgreSQL à l'aide de Navicat Premium 17. Dans la première partie, nous avons appris à créer un domaine personnalisé pour la base de données de location gratuite de DVD. Un domaine est un type de données défini par l'utilisateur avec des contraintes telles que NOT NULL et CHECK. Dans le blog d'aujourd'hui, nous allons créer un type composite pour renvoyer des données complexes à partir d'une fonction définie par l'utilisateur.

Définition des types PostgreSQL

Les types sont générés en utilisant la commande CREATE TYPE. Elle crée un type composite qui peut être utilisé dans les procédures stockées et les fonctions comme types de données des paramètres d'entrée ainsi que des valeurs renvoyées.

La commande CREATE TYPE de PostgreSQL prend en charge quatre variations principales :

  • Types composites : définit des données composites qui combinent deux ou plusieurs types de données, ce qui permet de créer des types de données complexes, multi-champs pouvant représenter des structures de données complexes.
  • Types d'énumération : ils sont définis comme un ensemble fixe de valeurs prédéfinies et nommées, limitant l'entrée à ces options spécifiques.
  • Types de plage : ils représentent des intervalles continus entre des valeurs, ce qui permet d'effectuer des opérations sophistiquées sur des plages de données contiguës telles que des dates ou des nombres.
  • Types de base : les types définis par l'utilisateur peuvent être créés à partir de types de base existants comme int, varchar ou numeric. Bien qu'il n'y ait pas de « type de base » spécifique pour les types définis par l'utilisateur, les nouveaux types sont essentiellement des extensions ou des contraintes appliquées à ces types de base PostgreSQL sous-jacents.

Dans les sections suivantes, nous explorerons les types composites plus en détail en créant un type et en l'utilisant dans une fonction.

L'instruction CREATE TYPE

Tous les types sont créés à l'aide de l'instruction CREATE TYPE. Supposons que nous souhaitions disposer d'une fonction qui renvoie plusieurs valeurs concernant un film, telles que l'identifiant du film, le titre et l'année de sortie. Voici la déclaration qui crée un type nommé « film_summary » :

CREATE TYPE film_summary AS (
    film_id INT4,
    title VARCHAR(255),
    release_year CHAR(4)
);

Création d'un type dans Navicat 17

Navicat Premium 17 et Navicat for PostgreSQL 17 proposent tous les deux des outils basés sur une interface graphique pour générer des types sans avoir à connaître la syntaxe exacte. Vous le trouverez sous « Autres » dans la barre d'outils principale :

type_menu_command (33K)

Ensuite, nous cliquerons sur la flèche située à côté de l'élément « Nouveau type » dans la barre d'outils « Objets ». Cela permet d'afficher les quatre options de création d'un type. Sélectionnez l'élément « Composite » dans le menu contextuel :

composite_menu_item (16K)

Cela fera apparaître une grille dans laquelle nous pourrons saisir les détails du champ. Comme les trois champs qui composent le type « film_summary » existent déjà, nous pouvons faire apparaître le tableau « film » dans le concepteur de tableaux et copier les données de type et de durée à partir de là. Voici les trois champs surlignés en rouge :

fields_in_table_designer (85K)

La grille comporte déjà une ligne vide pour le premier champ. Une fois que nous avons saisi ces informations, nous pouvons ajouter une nouvelle ligne en cliquant sur « Ajouter un membre ». Voici la grille complétée :

composite_type_fields (30K)

Avant de cliquer sur le bouton « Enregistrer », nous pouvons jeter un œil à l'instruction que Navicat va générer en cliquant sur l'onglet « Aperçu SQL » :

sql_preview_tab (22K)

Notez que le nom du type est « Sans titre » puisque nous n'avons pas encore enregistré la définition. C'est normal.

Attribuons maintenant le nom. En cliquant sur le bouton « Enregistrer », la boîte de dialogue « Enregistrer sous » s'ouvre et nous pouvons donner à notre type le nom de « film_summary » :

save_as_dialog (31K)

Utilisation du type film_summary dans une fonction

Il est maintenant temps d'utiliser le type « film_summary » comme type de retour d'une fonction. Comme pour la création de type, nous utiliserons l'outil GUI de Navicat pour ce faire. Pour accéder au concepteur de fonctions, cliquez sur le bouton « Fonction » dans la barre d'outils principale, puis sur « Nouvelle fonction » dans la barre d'outils « Objets ».

function_buttons (23K)

L'éditeur va pré-remplir la plupart de la syntaxe de la fonction CREATE FUNCTION pour nous. Nous devons juste fournir quelques détails comme le nom de la fonction, les paramètres d'entrée, le type de retour et le corps de la fonction. Voici l'instruction CREATE FUNCTION complétée :

CREATE FUNCTION get_film_summary (f_id INT4)
  RETURNS film_summary
AS $BODY$
  SELECT 
    film_id,
    title,
    release_year
  FROM
    film
  WHERE
    film_id = f_id;
$BODY$
  LANGUAGE SQL VOLATILE;
get_film_summary_function_definition (40K)

Assurez-vous également de définir la langue sur « SQL ».

Une fois que nous avons cliqué sur le bouton « Enregistrer », notre fonction est prête à être utilisée. Le moyen le plus rapide et le plus simple d'essayer une fonction est de cliquer sur le bouton « Exécuter ». Cela fera apparaître une invite permettant de fournir une valeur pour le paramètre « f_id » :

input_parameter_prompt (35K)

Les résultats devraient alors apparaître dans un nouvel onglet Résultat :

function_results (28K)

Conclusion

Dans le blog d'aujourd'hui, nous avons créé un type composite à l'aide de l'outil Type de Navicat Premium 17 et conçu une fonction qui renvoie notre type. La troisième partie portera sur les types d'énumération.

Partager
Archives du blog