Ja odkrywając TYPE
w PostgreSQL. Mam coś, TABLE TYPE
co niektóre tabele muszą respektować (interfejs). Na przykład:
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[]
);
Mogę utworzyć tabelę za pomocą tego szablonu z:
CREATE TABLE test OF dataset;
Widziałem wiele opcji w interfejsie API , ale jestem trochę zagubiony. Chciałbym wiedzieć, czy możliwe jest przypisanie tego typu do INPUT/OUTPUT
parametrów funkcji .
Powiedzmy, że mam FUNCTION
wywołanie, process
które pobiera próbkę rekordów z zestawu danych TABLE
source
, przetwarza je, a następnie zwraca to TABLE
sink
samo TYPE
.
Chciałbym wiedzieć, czy można stworzyć taki, TYPE
który zachowuje się tak:
CREATE FUNCTION process(
input dataset
) RETURNS dataset
AS ...
I można to tak nazwać:
SELECT
*
FROM
source, process(input := source) AS sink;
Zastanawiam się, czy jest to możliwe dzięki PostgreSQL i pytam, jak to zrobić. Czy ktoś z was wie?
Oto MWE tego, co próbuję zrobić:
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);
Ale to się nie udaje, to tak, jakby źródło było postrzegane jako kolumna zamiast SETOF RECORDS
z typem zestawu danych.
źródło
SELECT
. Mam na myśliSELECT * FROM process((SELECT * FROM source WHERE cond))
.To zrobi, co chcesz bez potrzeby dynamicznego SQL :
O ile mogę powiedzieć (po obszernym googlowaniu, ponieważ miałem ten sam problem), nie można przekazać tabeli bezpośrednio do funkcji.
Jednak, jak pokazano, możesz przekształcić tabelę w tablicę
[]
typu niestandardowego, która składa się z kilku podstawowych typów (podobnych do definicji tabeli).Następnie możesz przekazać tę tablicę i odkleić ją z powrotem do tabeli, gdy znajdziesz się w funkcji.
źródło