Ich entdecke TYPEin 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 FUNCTIONAnruf process, der eine Stichprobe von Datensätzen aus einem Datensatz empfängt TABLE source, verarbeitet und dann einen TABLE sinkmit 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 RECORDSmit dem Dataset-Typ wahrgenommen .
SELECT. Ich meineSELECT * FROM process((SELECT * FROM source WHERE cond)).