Estou descobrindo TYPE
no PostgreSQL. Eu tenho um TABLE TYPE
que alguma tabela deve respeitar (interface). Por exemplo:
CREATE TYPE dataset AS(
ChannelId INTEGER
,GranulityIdIn INTEGER
,GranulityId INTEGER
,TimeValue TIMESTAMP
,FloatValue FLOAT
,Status BIGINT
,QualityCodeId INTEGER
,DataArray FLOAT[]
,DataCount BIGINT
,Performance FLOAT
,StepCount INTEGER
,TableRegClass regclass
,Tags TEXT[]
,WeightedMean FLOAT
,MeanData FLOAT
,StdData FLOAT
,MinData FLOAT
,MaxData FLOAT
,MedianData FLOAT
,Percentiles FLOAT[]
);
Posso criar tabela usando este modelo com:
CREATE TABLE test OF dataset;
Eu já vi muitas opções na API , mas estou um pouco perdido. Gostaria de saber se é possível atribuir esse tipo a INPUT/OUTPUT
parâmetros de função .
Digamos que eu tenha FUNCTION
chamado um process
que receba uma amostra de registros de um conjunto de dados TABLE
source
, os processe e depois retorne um TABLE
sink
com o mesmo TYPE
.
Ou seja, eu gostaria de saber se é possível criar um TYPE
que se comporte assim:
CREATE FUNCTION process(
input dataset
) RETURNS dataset
AS ...
E isso pode ser chamado assim:
SELECT
*
FROM
source, process(input := source) AS sink;
Eu me pergunto que isso é possível com o PostgreSQL e pergunto como fazê-lo. Alguém sabe?
Aqui está um MWE do que estou tentando fazer:
DROP TABLE IF EXISTS source;
DROP FUNCTION IF EXISTS process(dataset);
DROP TYPE dataset;
CREATE TYPE dataset AS (
id INTEGER
,t TIMESTAMP
,x FLOAT
);
CREATE TABLE source OF dataset;
ALTER TABLE source ADD PRIMARY KEY(Id);
INSERT INTO source VALUES
(1, '2016-01-01 00:00:00', 10.0)
,(2, '2016-01-01 00:30:00', 11.0)
,(3, '2016-01-01 01:00:00', 12.0)
,(4, '2016-01-01 01:30:00', 9.0)
;
CREATE OR REPLACE FUNCTION process(
_source dataset
)
RETURNS SETOF dataset
AS
$BODY$
SELECT * FROM source;
$BODY$
LANGUAGE SQL;
SELECT * FROM process(source);
Mas não obtém êxito, é como se a fonte fosse percebida como uma coluna em vez de a SETOF RECORDS
com o tipo de conjunto de dados.
fonte
SELECT
. Quero dizerSELECT * FROM process((SELECT * FROM source WHERE cond))
.Isso fará o que você deseja sem precisar de nenhum SQL dinâmico :
Até onde eu sei (depois de pesquisar extensivamente, porque eu tinha o mesmo problema), você não pode passar uma tabela diretamente para uma função.
No entanto, como mostrado, você pode transformar uma tabela em uma matriz
[]
de um tipo personalizado que consiste em vários tipos básicos (semelhantes a uma definição de tabela).Em seguida, você pode passar esse array e desinvesti-lo novamente em uma tabela quando estiver na função.
fonte