Tôi đang khám phá TYPEtrong PostgreSQL. Tôi có một TABLE TYPEbảng mà một số bảng phải tôn trọng (giao diện). Ví dụ:
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[]
);
Tôi có thể tạo bảng bằng mẫu này với:
CREATE TABLE test OF dataset;
Tôi đã thấy nhiều tùy chọn trong API , nhưng tôi hơi lạc lõng. Tôi muốn biết nếu có thể gán loại này cho các INPUT/OUTPUTtham số chức năng .
Giả sử rằng tôi có một cuộc FUNCTIONgọi processnhận một mẫu hồ sơ từ một tập dữ liệu TABLE source, xử lý chúng và sau đó trả về một TABLE sinkcùng một TYPE.
Đó là tôi muốn biết liệu có thể tạo ra một TYPEhành vi như thế này không:
CREATE FUNCTION process(
input dataset
) RETURNS dataset
AS ...
Và điều đó có thể được gọi như thế này:
SELECT
*
FROM
source, process(input := source) AS sink;
Tôi tự hỏi rằng điều đó là có thể với PostgreSQL và hỏi làm thế nào để làm điều đó. Có ai trong số bạn biết?
Đây là một MWE về những gì tôi đang cố gắng làm:
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);
Nhưng nó không thành công, nó giống như nguồn được coi là một cột thay vì một SETOF RECORDSloại dữ liệu.
SELECT. Ý tôi làSELECT * FROM process((SELECT * FROM source WHERE cond)).