如何在 postgresql 中创建一个返回 SETOF 类型的函数?我所有的尝试都出现以下错误:
SQL 函数无法返回 shell 类型...
下面是我尝试运行的查询:
CREATE OR REPLACE FUNCTION public.assignment_scores(
skuunit_groupset_uid text,
userrole_uid text,
periodid integer,
dataset_uid text)
RETURNS SETOF score_in_assignment AS
$BODY$
SELECT DISTINCT sku.uid stu_uid,
EXTRACT(DAY FROM cdsr.date - p.enddate)::int AS delay,
skudistrict.name AS skuunit_parent_name,
sku.name AS skuunit_group_name,
sku.uid AS oskuunit_group_uid,
cdsr.storedby AS username,
ui.phonenumber
FROM completedatasetregistration cdsr
INNER JOIN period p ON cdsr.periodid = p.periodid
INNER JOIN dataset ds ON cdsr.datasetid = ds.datasetid
INNER JOIN skuunit skuvillage ON cdsr.sourceid = skuvillage.skuunitid
INNER JOIN _skuunitstructure ous ON cdsr.sourceid = ous.skuunitid
INNER JOIN organisationunit oudistrict ON oudistrict.organisationunitid = ` ous.idlevel3`
INNER JOIN skugroupmembers ougm ON ougm.skuunitid = oudistrict.skuunitid
INNER JOIN orgunitgroup oug ON oug.orgunitgroupid = ougm.skuunitgroupid
INNER JOIN skuunitgroupsetmembers ougsm ON ougsm.skuunitgroupid = ` ` oug.orgunitgroupid
INNER JOIN orgunitgroupset ougs ON ougs.orgunitgroupsetid = ` ougsm.orgunitgroupsetid`
AND ougs.uid = $1
INNER JOIN users u ON cdsr.storedby = u.username
INNER JOIN userinfo ui ON u.userid = ui.userinfoid
INNER JOIN userrolemembers urm ON u.userid = urm.userid
INNER JOIN userrole ur ON urm.userroleid = ur.userroleid
AND ur.uid = $2
WHERE p.periodid = $3 --lock to a single period
AND ds.uid = $4 --lock to a single dataset
AND EXTRACT(DAY FROM cdsr.date - p.enddate) < DATE_PART('days', ` DATE_TRUNC('month', p.startdate) + '1 MONTH'::INTERVAL - DATE_TRUNC('month', p.startdate)) AND EXTRACT(DAY FROM cdsr.date - p.enddate) >= 0 ;
$BODY$
LANGUAGE sql VOLATILE
我不知道是否已经有人提出过类似的问题并得到解决。如果有请指点我。
*我的回答详细解释了如何手动创建
SETOF <sometype>
类型。
例如,您可以创建
my_func()
,它返回 SETOF INT
类型,如下所示:
CREATE FUNCTION my_func() RETURNS SETOF INT
AS $$
VALUES (1), (2), (3);
$$ LANGUAGE SQL;
并且,您可以创建
my_func()
返回 SETOF TEXT
类型,如下所示。 *您可以将 TEXT
替换为 VARCHAR
:
CREATE FUNCTION my_func() RETURNS SETOF TEXT
AS $$
VALUES ('John'), ('David'), ('Robert');
$$ LANGUAGE SQL;
并且,您可以创建
my_func()
返回 SETOF RECORD
类型,如下所示:
CREATE FUNCTION my_func() RETURNS SETOF RECORD
AS $$
VALUES ('John','Smith'), ('David','Miller');
$$ LANGUAGE SQL;