CREATE TRANSFORM — define una nueva transformación (transform)
CREATE [ OR REPLACE ] TRANSFORM FORnombre_tipoLANGUAGEnombre_lenguaje( FROM SQL WITH FUNCTIONnombre_función_from_sql[ (tipo_argumento[, ...]) ], TO SQL WITH FUNCTIONnombre_función_to_sql[ (tipo_argumento[, ...]) ] );
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.
nombre_tipoEl nombre del tipo de datos de la transformación.
nombre_lenguajeEl 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.
Usa DROP TRANSFORM para eliminar transformaciones.
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.
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.
CREATE FUNCTION, CREATE LANGUAGE, CREATE TYPE, DROP TRANSFORM