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 .
quelle
SELECT
. Ich meineSELECT * FROM process((SELECT * FROM source WHERE cond))
.Dies macht, was Sie wollen, ohne dynamisches SQL zu benötigen :
Soweit ich das beurteilen kann (nachdem ich ausgiebig gegoogelt habe, weil ich das gleiche Problem hatte), kann man eine Tabelle nicht direkt an eine Funktion übergeben.
Wie gezeigt, können Sie eine Tabelle jedoch in ein Array umwandeln
[]
eines benutzerdefinierten Typs , der aus mehreren Basistypen besteht (ähnlich einer Tabellendefinition).Dann können Sie dieses Array übergeben und es wieder in eine Tabelle aufnehmen, sobald Sie in der Funktion sind.
quelle