Ich entdecke TYPE
in PostgreSQL. Ich habe eine TABLE TYPE
, die eine Tabelle respektieren muss (Schnittstelle). Beispielsweise:
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[]
);
Ich kann mit dieser Vorlage eine Tabelle erstellen mit:
CREATE TABLE test OF dataset;
Ich habe viele Optionen in der API gesehen , bin aber etwas verloren. Ich würde gerne wissen, ob es möglich ist, diesen Typ Funktionsparametern zuzuweisen INPUT/OUTPUT
.
Angenommen, ich habe einen FUNCTION
Anruf process
, der eine Stichprobe von Datensätzen aus einem Datensatz empfängt TABLE
source
, verarbeitet und dann einen TABLE
sink
mit demselben zurückgibt TYPE
.
Das heißt, ich würde gerne wissen, ob es möglich ist, eine zu erstellen TYPE
, die sich so verhält:
CREATE FUNCTION process(
input dataset
) RETURNS dataset
AS ...
Und das kann man so nennen:
SELECT
*
FROM
source, process(input := source) AS sink;
Ich frage mich, ob dies mit PostgreSQL möglich ist, und frage, wie das geht. Weiß jemand von euch?
Hier ist eine MWE von dem, was ich versuche zu tun:
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);
Aber es gelingt nicht, es ist, als würde die Quelle als Spalte statt als SETOF RECORDS
mit dem Dataset-Typ wahrgenommen .
SELECT
. Ich meineSELECT * FROM process((SELECT * FROM source WHERE cond))
.