Tôi đang khám phá TYPE
trong PostgreSQL. Tôi có một TABLE TYPE
bả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/OUTPUT
tham số chức năng .
Giả sử rằng tôi có một cuộc FUNCTION
gọi process
nhậ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
sink
cùng một TYPE
.
Đó là tôi muốn biết liệu có thể tạo ra một TYPE
hà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 RECORDS
loại dữ liệu.
SELECT
. Ý tôi làSELECT * FROM process((SELECT * FROM source WHERE cond))
.