Tipos compuestos
Bienvenidos a la segunda entrega de esta serie sobre la creación de tipos de datos personalizados en PostgreSQL con Navicat Premium 17. En la parte 1, aprendimos a crear un dominio personalizado para la base de datos gratuita DVD Rental. Un dominio es un tipo de datos definido por el usuario con restricciones como NOT NULL y CHECK. En el blog de hoy, crearemos un tipo compuesto para devolver datos complejos de una función definida por el usuario.
Definición de tipos de PostgreSQL
Los tipos se generan mediante el comando CREATE TYPE. Esto crea un tipo compuesto que se puede utilizar en procedimientos almacenados y funciones como tipos de datos de parámetros de entrada y valores devueltos.
CREATE TYPE de PostgreSQL admite cuatro variaciones principales:
- 1. Tipos Compuestos: define datos compuestos que combinan dos o más tipos de datos, lo que permite la creación de tipos de datos complejos de múltiples campos que pueden representar estructuras de datos intrincadas.
- 2. Tipos de Enumeración: se definen como un conjunto fijo de valores predefinidos y nombrados, que restringen la entrada sólo a esas opciones específicas.
- 3. Tipos de Rango: representan intervalos continuos entre valores, lo que permite operaciones sofisticadas en rangos de datos contiguos, como fechas o números.
- 4. Tipos Base: se pueden crear tipos definidos por el usuario en función de tipos base existentes, como “int”, “varchar” o “numeric”. Si bien no existe un "tipo base" específico para los tipos definidos por el usuario, los tipos nuevos son esencialmente extensiones o restricciones aplicadas a estos tipos base subyacentes de PostgreSQL.
En las siguientes secciones, exploraremos los Tipos Compuestos con más detalle mediante la creación de un tipo y su uso en una función.
La sentencia CREATE TYPE
Todos los tipos se crean mediante la sentencia CREATE TYPE. Supongamos que queremos tener una función que devuelva varios valores sobre una película, como el ID de la película, el título y el año de estreno. Esta es la sentencia que crea un tipo llamado "film_summary":
CREATE TYPE film_summary AS ( film_id INT4, title VARCHAR(255), release_year CHAR(4) );
Crear un Tipo en Navicat 17
Navicat Premium 17 y Navicat for PostgreSQL 17 ofrecen herramientas basadas en GUI para generar tipos sin tener que conocer toda la sintaxis exacta. La encontrará en "Otros" en la barra de herramientas principal:

A continuación, haremos clic en la flecha que se encuentra junto al elemento "Nuevo Tipo" en la barra de herramientas "Objetos". Esto mostrará las cuatro opciones diferentes para crear un tipo. Seleccione el elemento "Compuesto" en el menú contextual:

Esto abrirá una cuadrícula en la que podemos introducir los detalles de los campos. Dado que los tres campos que componen el tipo "film_summary" ya existen, podemos abrir la tabla "film" en el Diseñador de tablas y copiar el Tipo y la Longitud de los datos desde allí. Aquí están los tres campos resaltados en rojo:

La cuadrícula ya tendrá una fila vacía para el primer campo. Una vez que hayamos introducido sus datos, podemos agregar una nueva fila haciendo clic en "Agregar miembro". Aquí está la cuadrícula completa:

Antes de clicar en "Guardar" podemos echar un vistazo a la sentencia que generará Navicat haciendo clic en la pestaña "Vista previa de SQL":

Se ha de tener en cuenta que el nombre del tipo es "Sin título", ya que aún no hemos guardado la definición. Esto es lo esperado.
Ahora, asignemos el nombre. Al clicar en "Guardar", aparece el cuadro de diálogo "Guardar como", donde podemos darle a nuestro tipo el nombre "film_summary":

Uso del Tipo film_summary en una función
Ahora es el momento de utilizar "film_summary" como tipo de retorno de una función. Al igual que al crear tipos, utilizamos la herramienta GUI de Navicat para hacerlo. Para acceder al Diseñador de funciones, clicamos en "Función" en la barra de herramientas principal y luego en "Nueva función" en la barra de herramientas "Objetos":

El editor rellenará previamente la mayor parte de la sintaxis de CREATE FUNCTION; solo necesitamos proporcionar algunos detalles como el nombre de la función, los parámetros de entrada, el tipo de retorno y el cuerpo de la función. Aquí está la sentencia CREATE FUNCTION completa:
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;

Asegúrese también de configurar el lenguaje en "SQL".
Una vez que hagamos clic en el botón "Guardar", nuestra función estará lista para usarse. La forma más rápida y sencilla de probar una función es hacer clic en el botón "Ejecutar". Esto hará que aparezca un mensaje que le pedirá que proporcione un valor para el parámetro "f_id":

Los resultados deberían aparecer en una nueva pestaña de Resultado:

Conclusion
En el blog de hoy, hemos creado un Tipo Compuesto utilizando la herramienta Navicat Premium 17 y hemos diseñado una función que devuelve nuestro Tipo. En la parte 3 continuaremos con los tipos de Enumeración.