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 ] )
El nombre del tipo a ser creado.
Un valor literal, el cual especifica la longitud interna del nuevo tipo.
Un valor literal, el cual especifica la longitud externa del nuevo tipo.
El nombre de una función, creada mediante CREATE FUNCTION, la cual convierte los datos desde su forma externa a la forma interna de tipo.
El nombre de una función, creada mediante CREATE FUNCTION, la cual convierte los datos desde su forma interna a una forma conveniente para ser mostrados.
El tipo creado es un array; esto especifica el tipo de los elementos del array.
El carácter delimitador para el array.
El texto por defecto que se mostrar para indicar "datos no presentes"
El nombre de una función, creada mediante CREATE FUNCTION, la cual convierte los datos de este tipo a una forma adecuada para ser transmitidos a otra máquina.
El nombre de una función, creada mediante CREATE FUNCTION, la cual convierte los datos de este tipo a una forma adecuada para su transmisión desde otra máquina a la forma interna.
CREATE TYPE permite al usuario registrar un nuevo tipo de datos de usuario con Postgres para ser usado en la base de datos actual. El usuario que define un tipo se convierte en su propietario. typename es el nombre de del nuevo tipo y debe ser único dentro de los tipos definidos para esta base de datos.
CREATE TYPE necesita el registro de dos funciones (usando create function) antes de definir el tipo. La representación de un nuevo tipo base está determinada por input_function, la cual convierte la representación externa del tipo a una representación interna, utilizable por los operadores y funciones definidas por el tipo. Naturalmente output_function ejecuta la transformación inversa. Ambas funciones, la de entrada y la de salida deben ser declaradas para asumir uno o dos argumentos de tipo "opaque".
Los nuevos tipos de datos base pueden ser de longitud fija, en cuyo caso internallength es un entero positivo, o también pueden ser de longitud variable, en cuyo caso, Postgres asume que el nuevo tipo tiene el mismo formato que el tipo de datos suministrado por Postgres, "text". Para indicar que un tipo es de longitud variable, se debe especificar internallength como VARIABLE. La representación externa se especifica de forma similar usando la palabra clave externallength.
Para indicar que un tipo es un array y para indicar que un tipo tiene elementos de array, indique el tipo del elemento del array usando la palabra clave element. Por ejemplo, para definir un array de enteros de cuatro bytes ("int4"), especifique
ELEMENT = int4
Para indicar el delimitador a ser usado en arrays de este tipo, delimiter se puede fijar a un carácter espec¡fico. El delimitador por defecto es la coma (",").
Opcionalmente, hay un valor por defecto disponible en caso de que un usuario quiera algún patrón de bit espec¡fico para expresar "datos no presentes." Especifique el valor por defecto con la palabra clave DEFAULT.
Los argumentos opcionales send_function y receive_function son usados cuando el programa de aplicación que demanda los servicios Postgres reside en una máquina diferente. En este caso, la máquina en la cual se ejecuta Postgres puede usar un formato para el tipo de datos diferente del usado en la máquina remota. En este caso es conveniente convertir los items de datos a una forma estándar cuando se envien desde el servidor al cliente y convertirlos del formato estándar al espec¡fico de la máquina cuando el servidor recibe los datos desde el cliente. Si estas funciones no est n especificadas, se asume que el formato interno del tipo es aceptable en todas las arquitecturas de máquina releveantes. Por ejemplo, los caracteres simples no se tienen que convertir si se pasa desde un Sun-4 a un DECstation, pero muchos otros tipos s¡.
El flag opcional, PASSEDBYVALUE, indica que los operadores y funciones que usan este tipo de datos deben pasar los argumentos preferentemente por valor que por referencia. Dese cuenta de que no pasar¡a por valor tipos cuya representación interna es de más de cuatro bytes.
Para nuevos tipos base, un usuario puede definir operadores, funciones y conjuntos usando las facilidades apropiadas descritas en esta sección.
Existen dos funciones generalizadas incorporadas, array_in y array_out para la creación rápida de tipos de array de longitud variable. Estas funciones operan en arrays de cualquier tipo Posgres existente.
Un tipo Posgres regular sólo puede ser de longitud 8192 bytes. Si necesita un tipo mayor debe crear un tipo de objeto grande. El interface para estos tipos está ámpliamente explicado en The PostgreSQL Programmer's Guide. La longitud de todos los tipos de objeto grande es siempre VARIABLE.
Este comando crea el tipo de datos box y después usa el tipo en una definición de clase:
CREATE TYPE box (INTERNALLENGTH = 8, INPUT = my_procedure_1, OUTPUT = my_procedure_2); CREATE TABLE myboxes (id INT4, description box);
Este comando crea un tipo array de longitud variable con elementos enteros:
CREATE TYPE int4array (INPUT = array_in, OUTPUT = array_out, INTERNALLENGTH = VARIABLE, ELEMENT = int4); CREATE TABLE myarrays (id int4, numbers int4array);
Este comando crea un tipo de objeto grande y lo usa en una definición de clase:
CREATE TYPE bigobj (INPUT = lo_filein, OUTPUT = lo_fileout, INTERNALLENGTH = VARIABLE); CREATE TABLE big_objs (id int4, obj bigobj);
Los nombres de tipos no pueden empezar por el carácter guión bajo ("_") y sólo pueden tener una longitud de 31 carácteres. Esto es debido a que Postgres crea sin informar un tipo array para cada tipo base con un nombre que consiste en el nombre del tipo base precedido de un guión bajo.
Refiérase a DROP TYPE para borrar un tipo existente.
Vea también CREATE FUNCTION, CREATE OPERATOR y el cap¡tulo de Objetos Grandes, 'Large Objects', en PostgreSQL Programmer's Guide.