如何在 PostgreSQL 中创建返回 SETOF 类型的函数?

问题描述 投票:0回答:1

如何在 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

我不知道是否已经有人提出过类似的问题并得到解决。如果有请指点我。

sql database postgresql set postgresql-9.5
1个回答
0
投票

*我的回答详细解释了如何手动创建

SETOF <sometype>
类型。

例如,您可以创建

my_func()
,它返回
SETOF INT
类型,如下所示:

CREATE FUNCTION my_func() RETURNS SETOF INT
AS $$
VALUES (1), (2), (3);
$$ LANGUAGE SQL;

然后,调用

my_func()
返回 3 行,如下所示:

postgres=# SELECT my_func();
 my_func
---------
       1
       2
       3
(3 rows)

并且,您可以创建

my_func()
返回
SETOF TEXT
类型,如下所示。 *您可以将
TEXT
替换为
VARCHAR
:

CREATE FUNCTION my_func() RETURNS SETOF TEXT
AS $$
VALUES ('John'), ('David'), ('Robert');
$$ LANGUAGE SQL;

然后,调用

my_func()
返回 3 行,如下所示:

postgres=# SELECT my_func();
 my_func
---------
 John
 David
 Robert
(3 rows)

并且,您可以创建

my_func()
返回
SETOF RECORD
类型,如下所示:

CREATE FUNCTION my_func() RETURNS SETOF RECORD
AS $$
VALUES ('John','Smith'), ('David','Miller');
$$ LANGUAGE SQL;

然后,调用

my_func()
返回 2 行,如下所示:

postgres=# SELECT my_func();
    my_func
----------------
 (John,Smith)
 (David,Miller)
(2 rows)
© www.soinside.com 2019 - 2024. All rights reserved.