ฉันกำลังค้นพบTYPE
ใน PostgreSQL ฉันมีTABLE TYPE
ตารางที่ต้องเคารพ (อินเตอร์เฟส) ตัวอย่างเช่น:
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[]
);
ฉันสามารถสร้างตารางโดยใช้เทมเพลตนี้ด้วย:
CREATE TABLE test OF dataset;
ฉันเห็นตัวเลือกมากมายในAPIแต่ฉันทำหายไปเล็กน้อย ฉันต้องการทราบว่าเป็นไปได้หรือไม่ที่จะกำหนดINPUT/OUTPUT
พารามิเตอร์ประเภทนี้ให้กับฟังก์ชัน
ขอบอกว่าฉันมีFUNCTION
ที่เรียกว่าprocess
ที่ได้รับตัวอย่างของระเบียนจากชุดข้อมูลTABLE
source
กระบวนการพวกเขาและจากนั้นส่งกลับด้วยเหมือนกันTABLE
sink
TYPE
นั่นคือฉันอยากจะรู้ว่ามันเป็นไปได้ที่จะสร้างสิ่งTYPE
ที่มีลักษณะเช่นนี้หรือไม่:
CREATE FUNCTION process(
input dataset
) RETURNS dataset
AS ...
และสามารถเรียกได้ว่าเป็นเช่นนี้:
SELECT
*
FROM
source, process(input := source) AS sink;
ฉันสงสัยว่ามันเป็นไปได้กับ PostgreSQL และถามว่าจะทำอย่างไร คุณรู้จักใครบ้าง
นี่คือ MWE ของสิ่งที่ฉันพยายามทำ:
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);
แต่มันไม่ประสบความสำเร็จมันก็เหมือนกับการรับรู้แหล่งที่มาเป็นคอลัมน์แทนที่จะเป็นSETOF RECORDS
กับประเภทของชุดข้อมูล
SELECT
เพียงแค่ต้องรู้ก่อนการทดสอบเป็นวิธีการแก้ปัญหาของคุณได้รับการยอมรับที่จะเป็นแถวจากSELECT * FROM process((SELECT * FROM source WHERE cond))
ผมหมายถึง