CREATE TRANSFORM — define uma nova transformação
CREATE [ OR REPLACE ] TRANSFORM FORnome_do_tipo_de_dadosLANGUAGEnome_da_linguagem( FROM SQL WITH FUNCTIONnome_da_função_do_sql[ (tipo_de_dados_do_argumento[, ...]) ], TO SQL WITH FUNCTIONnome_da_função_para_o_sql[ (tipo_de_dados_do_argumento[, ...]) ] );
O comando CREATE TRANSFORM define uma nova
transformação
[142].
O comando CREATE OR REPLACE TRANSFORM define
uma nova transformação, ou substitui uma definição existente.
Uma transformação especifica como adaptar um tipo de dados a uma
linguagem procedural.
Por exemplo, ao escrever uma função em PL/Python
usando o tipo de dados hstore, o
PL/Python não tem conhecimento prévio de
como representar valores hstore no ambiente
Python.
As implementações de linguagem geralmente usam como padrão a
representação textual, mas isto é inconveniente quando, por exemplo,
uma matriz associativa ou uma lista seria mais apropriada.
Uma transformação especifica duas funções:
Uma função “do SQL”, que converte o tipo de dados do ambiente SQL para a linguagem. Esta função será chamada nos argumentos da função escrita na linguagem.
Uma função “para o SQL”, que converte o tipo de dados da linguagem para o ambiente SQL. Esta função será chamada no valor de retorno da função escrita na linguagem.
Não é necessário fornecer estas duas funções. Se uma delas não for especificada, o comportamento padrão específico da linguagem será usado, se necessário. (Para evitar que uma transformação em uma determinada direção aconteça, deve-se também escrever uma função de transformação que sempre apresenta erros.)
Para poder criar uma transformação, é necessário ser o dono e ter o
privilégio USAGE no tipo de dados, ter o privilégio
USAGE na linguagem, e ser o dono e ter o privilégio
EXECUTE nas funções “do SQL” e
“para o SQL”, se estas forem especificadas.
nome_do_tipo_de_dadosO nome do tipo de dados da transformação.
nome_da_linguagemO nome da linguagem da transformação.
nome_da_função_do_sql[ (tipo_de_dados_do_argumento [, ...])]
O nome da função para converter o tipo de dados do ambiente
SQL para a linguagem.
Deve receber um argumento do tipo de dados internal,
e retornar o tipo de dados internal.
O argumento real será do tipo de dados para a transformação, e a
função deve ser codificada como se assim fosse.
(Mas não é permitido declarar uma função no nível do
SQL retornando internal, sem ter
pelo menos um argumento do tipo de dados internal.)
O valor retornado real será algo específico para a implementação
da linguagem.
Se não for especificada nenhuma lista de argumentos, o nome da
função deverá ser único em seu esquema.
nome_da_função_para_o_sql[ (tipo_de_dados_do_argumento [, ...])]
O nome da função para converter o tipo de dados da linguagem
para o ambiente SQL.
Deve receber um argumento do tipo de dados internal,
e retornar o tipo de dados que é o tipo de dados para a
transformação.
O valor real do argumento será algo específico para a
implementação da linguagem.
Se não for especificada nenhuma lista de argumentos, o nome da
função deverá ser único em seu esquema.
Deve-se usar o comando DROP TRANSFORM para remover transformações.
Para criar uma transformação para o tipo de dados hstore
e a linguagem plpython3u, primeiro deve ser
configurado o tipo de dados e a linguagem:
CREATE TYPE hstore ...; CREATE EXTENSION plpython3u;
Em seguida, criadas as funções necessárias:
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 ...;
E, finalmente, criada a transformação para conectá-los todos juntos:
CREATE TRANSFORM FOR hstore LANGUAGE plpython3u (
FROM SQL WITH FUNCTION hstore_to_plpython(internal),
TO SQL WITH FUNCTION plpython_to_hstore(internal)
);
Na prática, estes comandos seriam empacotados em uma extensão.
O diretório contrib da distribuição do
código-fonte contém várias extensões que fornecem transformações,
que podem servir como exemplos do mundo real.
Esta forma do comando CREATE TRANSFORM é uma
extensão do PostgreSQL.
Existe o comando CREATE TRANSFORM no padrão
SQL, mas é para adaptar os tipos de dados às
linguagens do cliente.
Este uso não tem suporte pelo PostgreSQL.
CREATE FUNCTION, CREATE LANGUAGE, CREATE TYPE, DROP TRANSFORM
[142]
O comando CREATE TRANSFORM define funções de
transformação, identificadas por um nome de grupo, que são usadas
para trocar valores de tipo de dados estruturados com programas
da linguagem hospedeira e com funções externas.
IBM DB2 12.1.x – CREATE TRANSFORM statement (N. T.)