Estoy descubriendo TYPE
en PostgreSQL. Tengo un TABLE TYPE
que alguna tabla debe respetar (interfaz). Por ejemplo:
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[]
);
Puedo crear una tabla usando esta plantilla con:
CREATE TABLE test OF dataset;
He visto muchas opciones en la API , pero estoy un poco perdido. Me gustaría saber si es posible asignar este tipo a INPUT/OUTPUT
parámetros de función .
Digamos que tengo una FUNCTION
llamada process
que recibe una muestra de registros de un conjunto de datos TABLE
source
, los procesa y luego devuelve un TABLE
sink
con el mismo TYPE
.
Es decir, me gustaría saber si es posible crear uno TYPE
que se comporte así:
CREATE FUNCTION process(
input dataset
) RETURNS dataset
AS ...
Y eso se puede llamar así:
SELECT
*
FROM
source, process(input := source) AS sink;
Me pregunto si es posible con PostgreSQL, y pregunto cómo hacerlo. ¿Alguien de ustedes sabe?
Aquí hay un MWE de lo que estoy tratando de hacer:
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);
Pero no tiene éxito, es como la fuente se percibe como una columna en lugar de una SETOF RECORDS
con el tipo de conjunto de datos.
fuente
SELECT
. Me refieroSELECT * FROM process((SELECT * FROM source WHERE cond))
.Esto hará lo que quiera sin necesidad de ningún SQL dinámico :
Por lo que puedo decir (después de buscar en Google extensivamente, porque tuve el mismo problema) no puedes pasar una tabla directamente a una función.
Sin embargo, como se muestra, puede transformar una tabla en una matriz
[]
de un tipo personalizado que consta de varios tipos básicos (similar a una definición de tabla).Luego puede pasar esa matriz y deshacerla de nuevo en una tabla una vez que esté en la función.
fuente