Я открываю TYPE
для PostgreSQL. У меня есть, TABLE TYPE
что некоторые таблицы должны уважать (интерфейс). Например:
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[]
);
Я могу создать таблицу, используя этот шаблон с:
CREATE TABLE test OF dataset;
Я видел много вариантов в API , но я немного растерялся. Я хотел бы знать, можно ли назначить этот тип для INPUT/OUTPUT
параметров функции .
Допустим, у меня есть FUNCTION
вызываемый, process
который получает выборку записей из набора данных TABLE
source
, обрабатывает их и затем возвращает a TABLE
sink
с тем же TYPE
.
То есть я хотел бы знать, возможно ли создать объект, TYPE
который ведет себя так:
CREATE FUNCTION process(
input dataset
) RETURNS dataset
AS ...
И это можно назвать так:
SELECT
*
FROM
source, process(input := source) AS sink;
Интересно, что это возможно с PostgreSQL, и спрашиваю, как это сделать. Кто-нибудь из вас знает?
Вот MWE того, что я пытаюсь сделать:
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);
Но это не удается, это как источник воспринимается как столбец, а не SETOF RECORDS
с типом набора данных.
источник
SELECT
. Я имею в видуSELECT * FROM process((SELECT * FROM source WHERE cond))
.Это будет делать то, что вы хотите, без необходимости какого-либо динамического SQL :
Насколько я могу сказать (после экстенсивного гуглинга, потому что у меня была та же проблема), вы не можете передать таблицу непосредственно в функцию.
Однако, как показано, вы можете преобразовать таблицу в массив
[]
пользовательского типа, который состоит из нескольких основных типов (аналогично определению таблицы).Затем вы можете передать этот массив и удалить его обратно в таблицу, как только окажетесь в функции.
источник