Je découvre TYPE
dans PostgreSQL. J'en ai un TABLE TYPE
que certaines tables doivent respecter (interface). Par exemple:
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[]
);
Je peux créer un tableau en utilisant ce modèle avec:
CREATE TABLE test OF dataset;
J'ai vu de nombreuses options dans l' API , mais je suis un peu perdu. Je voudrais savoir s'il est possible d'assigner ce type aux INPUT/OUTPUT
paramètres de fonction .
Disons que j'ai un FUNCTION
appelé process
qui reçoit un échantillon d'enregistrements d'un ensemble de données TABLE
source
, les traite puis renvoie un TABLE
sink
avec le même TYPE
.
C'est-à-dire que j'aimerais savoir s'il est possible de créer un TYPE
qui se comporte comme ceci:
CREATE FUNCTION process(
input dataset
) RETURNS dataset
AS ...
Et cela peut être appelé comme ceci:
SELECT
*
FROM
source, process(input := source) AS sink;
Je me demande si c'est possible avec PostgreSQL, et je demande comment faire. Est-ce que quelqu'un d’entre vous le sait?
Voici un MWE de ce que j'essaie de faire:
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);
Mais cela ne réussit pas, c'est comme si la source était perçue comme une colonne au lieu d'une SETOF RECORDS
avec le type d'ensemble de données.
la source
SELECT
. Je veux direSELECT * FROM process((SELECT * FROM source WHERE cond))
.Cela fera ce que vous voulez sans avoir besoin de SQL dynamique :
Autant que je sache (après avoir googlé longuement, car j'ai eu le même problème), vous ne pouvez pas passer directement une table à une fonction.
Cependant, comme illustré, vous pouvez transformer une table en un tableau
[]
d'un type personnalisé composé de plusieurs types de base (similaire à une définition de table).Ensuite, vous pouvez passer ce tableau et le réintégrer dans une table une fois que vous êtes dans la fonction.
la source