Saya menemukan TYPE
di PostgreSQL. Saya punya TABLE TYPE
beberapa tabel yang harus dihormati (antarmuka). Sebagai contoh:
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[]
);
Saya bisa membuat tabel menggunakan templat ini dengan:
CREATE TABLE test OF dataset;
Saya telah melihat banyak opsi di API , tetapi saya agak bingung. Saya ingin tahu apakah mungkin untuk menetapkan tipe ini ke INPUT/OUTPUT
parameter fungsi .
Membiarkan mengatakan bahwa saya telah sebuah FUNCTION
disebut process
yang menerima sampel catatan dari dataset TABLE
source
, proses mereka dan kemudian kembali TABLE
sink
dengan sama TYPE
.
Saya ingin tahu apakah mungkin untuk membuat TYPE
yang berperilaku seperti ini:
CREATE FUNCTION process(
input dataset
) RETURNS dataset
AS ...
Dan itu bisa disebut seperti ini:
SELECT
*
FROM
source, process(input := source) AS sink;
Saya bertanya-tanya apakah mungkin dengan PostgreSQL, dan bertanya bagaimana melakukannya. Apakah ada di antara kalian yang tahu?
Inilah MWE dari apa yang saya coba lakukan:
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);
Tapi itu tidak berhasil, itu seperti sumber dianggap sebagai kolom bukan SETOF RECORDS
dengan tipe dataset.
sumber
SELECT
. MaksudkuSELECT * FROM process((SELECT * FROM source WHERE cond))
.Ini akan melakukan apa yang Anda inginkan tanpa memerlukan SQL dinamis :
Sejauh yang saya tahu (setelah googeling dengan extensivly, karena saya memiliki masalah yang sama), Anda tidak dapat melewatkan tabel langsung ke suatu fungsi.
Namun, seperti yang ditunjukkan, Anda bisa mengubah tabel menjadi larik
[]
tipe kustom yang terdiri dari beberapa tipe dasar (mirip dengan definisi tabel).Kemudian Anda bisa melewatkan array itu dan mengembalikannya ke tabel setelah Anda berada dalam fungsi.
sumber