Tipos definidos por el usuario

Un tipo de datos definido por el usuario (UDT) es un tipo de datos que deriva de un tipo de datos existente. Puede utilizar UDT para ampliar los tipos incorporados ya disponibles y crear sus propios tipos de datos personalizados.

Existen seis tipos definidos por el usuario:
  • Tipo diferenciado
  • Tipo estructurado
  • Tipo de referencia
  • Tipo de matriz
  • Tipo de fila
  • Tipo de cursor
Cada uno de ellos se describe en los apartados siguientes.

Tipo diferenciado

Un tipo diferenciado es un tipo de datos definido por el usuario que comparte su representación interna con un tipo de datos incorporado existente (su tipo "fuente").

Los tipos diferenciados incluyen identificadores calificados. Si no se utiliza el nombre de esquema para calificar el nombre del tipo diferenciado cuando se utiliza en sentencias que no son CREATE TYPE (Diferenciado), DROP o COMMENT, en la vía de acceso de SQL se busca por orden el primer esquema con un tipo diferenciado que coincida.

Los tipos diferenciados derivados de tipos LOB están sujetos a las mismas restricciones que su tipo fuente.

Un tipo diferenciado se define para utilizar normas de tipificación firme o no firme. Las normas de tipificación firme son el valor predeterminado.
Tipo diferenciado de tipado fuerte
Se considera que un tipo diferenciado de tipado fuerte es un tipo separado y no compatible para la mayoría de las operaciones. Por ejemplo, desea definir un tipo de imagen, un tipo de texto y un tipo de audio. Cada uno de estos tipos tiene semánticas distintas, pero cada uno de ellos utiliza el tipo de datos incorporado BLOB para su representación interna.
El siguiente ejemplo ilustra la creación de un tipo diferenciado denominado AUDIO:
   CREATE TYPE AUDIO  AS BLOB (1M)
Aunque AUDIO tiene la misma representación que el tipo de datos incorporado BLOB, se considera un tipo separado; esto permite la creación de funciones escritas especialmente para AUDIO y garantiza que estas funciones no se aplicarán a los valores de ningún otro tipo de datos.

Los tipos diferenciados de tipado fuerte dan soporte a la tipificación firme, lo que garantiza que sólo podrán aplicarse a sus instancias las funciones y operadores que se han definido explícitamente en el tipo diferenciado. Por este motivo, un tipo diferenciado de tipado fuerte no adquiere automáticamente las funciones y operadores de su tipo fuente, pues estas funciones podrían no ser significativas. Por ejemplo, podría definirse una función LENGTH para dar soporte a un parámetro con el tipo de datos AUDIO que devuelve la longitud del objeto en segundos en lugar de en bytes.

Tipo diferenciado de tipado débil
Se considera que un tipo diferenciado de tipado débil es lo mismo que su tipo fuente para todas las operaciones, excepto cuando el tipo diferenciado de tipado débil aplica restricciones para los valores durante las asignaciones o conversiones. Esta consideración también se aplica a la resolución de funciones.
En el siguiente ejemplo se muestra la creación de un tipo diferenciado denominado POSITIVEINTEGER:
   CREATE TYPE POSITIVEINTEGER AS INTEGER
         WITH WEAK TYPE RULES CHECK (VALUE>=0)
La tipificación no firme significa que, a excepción de la aceptación de valores enteros positivos únicamente, POSITIVEINTEGER funciona del mismo modo que su tipo de datos subyacente INTEGER.

Un tipo diferenciado de tipado débil puede utilizarse como método alternativo para hacer referencia a un tipo de datos incorporado dentro del código de la aplicación. La posibilidad de definir restricciones para los valores que se asocian al tipo diferenciado proporciona un método para comprobar valores durante las asignaciones y conversiones.

La utilización de tipos diferenciados puede aportar ventajas, tal como se indica en las siguientes categorías:
Capacidad de extensión
Mediante la definición de nuevos tipos de datos, puede incrementar el conjunto de tipos de datos disponibles para dar soporte a las aplicaciones.
Flexibilidad
Puede especificar cualquier semántica y comportamiento para el nuevo tipo de datos utilizando funciones definidas por el usuario (UDF) para aumentar la diversidad de tipos de datos disponibles en el sistema.
Comportamiento coherente y heredado
La tipificación firme garantiza que sólo podrán aplicarse a las instancias del tipo diferenciado las funciones definidas en su tipo diferenciado. La tipificación no firme garantiza que el tipo diferenciado se comportará del mismo modo que su tipo de datos subyacente y, por lo tanto, puede utilizar las mismas funciones y métodos disponibles para ese tipo subyacente.
Encapsulación
La utilización de un tipo diferenciado de tipado débil permite definir restricciones de tipo de datos en una ubicación para todos los usos dentro del código de la aplicación para ese tipo diferenciado.
Rendimiento
Los tipos diferenciados ofrecen gran integración en el gestor de bases de datos. Puesto que los tipos diferenciados se representan internamente del mismo modo que los tipos de datos incorporados, comparten el mismo código eficiente que se utiliza para implementar componentes como las funciones incorporadas, los operadores de comparación y los índices para tipos de datos incorporados.

No todos los tipos de datos incorporados pueden utilizarse para definir tipos diferenciados. El tipo de datos de origen no puede ser XML, matriz, fila ni cursor. Para obtener más información, consulte Sentencia CREATE TYPE (diferenciado).

Tipo estructurado

Un tipo estructurado es un tipo de datos definido por el usuario con una estructura definida en la base de datos. Contiene una secuencia de atributos con nombre, cada uno de los cuales tiene un tipo de datos. Un tipo estructurado también incluye un conjunto de especificaciones de método.

Un tipo estructurado se puede utilizar como tipo de una tabla, vista o columna. Cuando se utiliza como tipo para una tabla o vista, esa tabla o vista se denomina tabla con tipo o vista con tipo. Para las tablas con tipo y vistas con tipo, los nombres y tipos de datos de los atributos del tipo estructurado pasan a ser los nombres y tipos de datos de las columnas de esta tabla o vista con tipo. Las filas de la tabla o vista con tipo pueden considerarse una representación de instancias del tipo estructurado. Cuando se utiliza como tipo de datos para una columna, la columna contiene valores de ese tipo estructurado (o valores de cualquiera de los subtipos de ese tipo, tal como se describe más adelante en esta misma sección). Los métodos se utilizan para recuperar o manipular atributos de un objeto de columna estructurado.

Un supertipo es un tipo estructurado para el que definen otros tipos estructurados, denominados subtipos. Un subtipo hereda todos los atributos y métodos de su supertipo y puede tener definidos atributos y métodos adicionales. El conjunto de tipos estructurados que está relacionado con un supertipo común se denomina jerarquía de tipo y el tipo que no tiene ningún supertipo se denomina tipo raíz de la jerarquía de tipos.

El término subtipo se aplica a un tipo estructurado definido por el usuario y a todos los tipos estructurados definidos por el usuario que están debajo de él en la jerarquía de tipos. Por tanto, un subtipo de un tipo estructurado T es T y todos los tipos estructurados por debajo de T en la jerarquía. Un subtipo propio de un tipo estructurado T es un tipo estructurado por debajo de T en la jerarquía de tipos.

Existen restricciones respecto a la existencia de definiciones recursivas de tipos en una jerarquía de tipos. Por esta razón, es necesario desarrollar una forma abreviada de hacer referencia al tipo específico de definiciones recursivas que están permitidas. Se utilizan las definiciones siguientes:
  • Utiliza directamente: se dice que un tipo A utiliza directamente otro tipo B, si y sólo si se cumple una de las condiciones siguientes:
    1. El tipo A tiene un atributo de tipo B.
    2. El tipo B es un subtipo de A o un supertipo de A.
  • Utiliza indirectamente: se dice que un tipo A utiliza indirectamente un tipo B si se cumple una de las condiciones siguientes:
    1. El tipo A utiliza directamente el tipo B.
    2. El tipo A utiliza directamente algún tipo C, y el tipo C utiliza indirectamente el tipo B.

Un tipo no puede definirse de modo que uno de sus tipos de atributo se utilice, directa o indirectamente, a sí mismo. Si es necesario tener una configuración así, considere la posibilidad de utilizar una referencia como atributo. Por ejemplo, en el caso de atributos de tipos estructurados, no puede existir una instancia de "empleado" que tenga el atributo "director" cuando "director" es de tipo "empleado". En cambio, puede existir un atributo "director" cuyo tipo sea REF(empleado).

Un tipo no se puede descartar si ciertos otros objetos utilizan el tipo, ya sea directa o indirectamente. Por ejemplo, no se puede descartar un tipo si una columna de una tabla o vista hace uso directa o indirectamente del tipo.

Tipo de referencia

Un tipo de referencia es un tipo compañero de un tipo estructurado. De manera similar a un tipo diferenciado, un tipo de referencia es un tipo escalar que comparte una representación común con uno de los tipos de datos internos. Todos los tipos de la jerarquía de tipos comparten esta misma representación. La representación de un tipo de referencia se define cuando se crea el tipo raíz de una jerarquía de tipos. Cuando se utiliza un tipo de referencia, se especifica un tipo estructurado como parámetro del tipo. Este parámetro se denomina el tipo de destino de la referencia.

El destino de una referencia siempre es una fila de una tabla con tipo o una vista con tipo. Cuando se utiliza un tipo de referencia, éste puede tener definido un ámbito. El ámbito identifica una tabla (denominada tabla de destino) o una vista (denominada vista de destino) que contiene la fila de destino de un valor de referencia. La tabla de destino o la vista de destino debe tener el mismo tipo que el tipo de destino del tipo de referencia. Una instancia de un tipo de referencia con ámbito identifica de forma exclusiva una fila en una tabla con tipo o en una vista con tipo, denominada fila de destino.

Tipo de matriz

Un tipo de matriz definido por el usuario es un tipo de datos que se define como matriz con elementos de otro tipo de datos. Cada tipo de matriz ordinaria tiene un índice con el tipo de datos INTEGER y tiene definida una cardinalidad máxima. Cada matriz asociativa tiene un índice con el tipo de datos INTEGER o VARCHAR y no tiene definida una cardinalidad máxima.

Tipo de fila

Un tipo de fila es un tipo de datos que se define como una secuencia ordenada de campos con nombre, cada uno con un tipo de datos asociado, que representa efectivamente una fila. Un tipo de fila se puede utilizar como tipo de datos para variables y parámetros en SQL PL a fin de proporcionar una manipulación sencilla de una fila de datos.

Tipo de cursor

Un tipo de cursor definido por el usuario es un tipo de datos definido por el usuario con la palabra clave CURSOR y opcionalmente con un tipo de fila asociado. Un tipo de cursor definido por el usuario con un tipo de fila asociado es un tipo de cursor de tipado fuerte; de otro modo, es un tipo de cursor de tipado débil. El valor de un tipo de cursor definido por el usuario representa una referencia a un cursor subyacente.