CREATE TRANSFORM

CREATE TRANSFORM — define una nueva transformación (transform)

Synopsis

CREATE [ OR REPLACE ] TRANSFORM FOR nombre_tipo LANGUAGE nombre_lenguaje (
    FROM SQL WITH FUNCTION nombre_función_from_sql [ (tipo_argumento [, ...]) ],
    TO SQL WITH FUNCTION nombre_función_to_sql [ (tipo_argumento [, ...]) ]
);

Descripción

CREATE TRANSFORM define una nueva transformación. CREATE OR REPLACE TRANSFORM creará una nueva transformación o reemplazará una definición existente.

Una transformación especifica cómo adaptar un tipo de datos a un lenguaje procedimental. Por ejemplo, al escribir una función en PL/Python usando el tipo hstore, PL/Python no tiene conocimiento previo de cómo presentar los valores de hstore en el entorno Python. Las implementaciones de lenguajes suelen utilizar por defecto la representación de texto, pero esto resulta inconveniente cuando, por ejemplo, un array asociativo o una lista sería más apropiada.

Una transformación especifica dos funciones:

  • Una función from SQL que convierte el tipo desde el entorno SQL al lenguaje. Esta función se invocará en los argumentos de una función escrita en dicho lenguaje.

  • Una función to SQL que convierte el tipo desde el lenguaje al entorno SQL. Esta función se invocará en el valor de retorno de una función escrita en dicho lenguaje.

No es necesario proporcionar ambas funciones. Si una de ellas no se especifica, se utilizará el comportamiento por defecto específico del lenguaje en caso de ser necesario. (Para evitar por completo que ocurra una transformación en cierta dirección, también podrías escribir una función de transformación que siempre devuelva un error).

Para poder crear una transformación, debes ser el propietario y tener el privilegio USAGE en el tipo de datos, tener el privilegio USAGE en el lenguaje, y ser propietario y tener el privilegio EXECUTE en las funciones from-SQL y to-SQL, si se especifican.

Parámetros

nombre_tipo

El nombre del tipo de datos de la transformación.

nombre_lenguaje

El nombre del lenguaje de la transformación.

nombre_función_from_sql[(tipo_argumento [, ...])]

El nombre de la función para convertir el tipo desde el entorno SQL al lenguaje. Debe tomar un argumento de tipo internal y devolver el tipo internal. El argumento real será del tipo correspondiente a la transformación, y la función debe codificarse como si lo fuera. (Pero no está permitido declarar una función a nivel de SQL que devuelva internal sin al menos un argumento de tipo internal). El valor de retorno real será algo específico de la implementación del lenguaje. Si no se especifica una lista de argumentos, el nombre de la función debe ser único en su esquema.

nombre_función_to_sql[(tipo_argumento [, ...])]

El nombre de la función para convertir el tipo desde el lenguaje al entorno SQL. Debe tomar un argumento de tipo internal y devolver el tipo que corresponda al de la transformación. El valor del argumento real será algo específico de la implementación del lenguaje. Si no se especifica una lista de argumentos, el nombre de la función debe ser único en su esquema.

Notas

Usa DROP TRANSFORM para eliminar transformaciones.

Ejemplos

Para crear una transformación para el tipo hstore y el lenguaje plpython3u, primero configura el tipo y el lenguaje:

CREATE TYPE hstore ...;

CREATE EXTENSION plpython3u;

Luego crea las funciones necesarias:

CREATE FUNCTION hstore_to_plpython(val internal) RETURNS internal
LANGUAGE C STRICT IMMUTABLE
AS ...;

CREATE FUNCTION plpython_to_hstore(val internal) RETURNS hstore
LANGUAGE C STRICT IMMUTABLE
AS ...;

Y finalmente crea la transformación para conectarlas a todas:

CREATE TRANSFORM FOR hstore LANGUAGE plpython3u (
    FROM SQL WITH FUNCTION hstore_to_plpython(internal),
    TO SQL WITH FUNCTION plpython_to_hstore(internal)
);

En la práctica, estos comandos estarían empaquetados en una extensión.

La sección contrib contiene una serie de extensiones que proporcionan transformaciones, las cuales pueden servir como ejemplos del mundo real.

Compatibilidad

Esta forma de CREATE TRANSFORM es una extensión de PostgreSQL. Existe un comando CREATE TRANSFORM en el estándar SQL, pero sirve para adaptar tipos de datos a lenguajes cliente. Ese uso no está admitido por PostgreSQL.

Consulte también

CREATE FUNCTION, CREATE LANGUAGE, CREATE TYPE, DROP TRANSFORM