gpt4 book ai didi

PostgreSQL 在使用自定义类型时只返回一行

转载 作者:行者123 更新时间:2023-11-29 12:11:21 25 4
gpt4 key购买 nike

我有一个返回自定义类型(伪代码)的 plpgsql 函数:

CREATE OR REPLACE FUNCTION my_function(entity_id integer)
RETURNS "CustomType" AS
$BODY$

DECLARE
result "CustomType";
BEGIN

SELECT
INTO result
T."Column1" AS "Column1",
T."Column2" AS "Column2"
FROM "Table1" T
WHERE T."EntityId" = entity_id

--do other stuff here before returning

RETURN QUERY
SELECT
result."Column1",
result."Column2"
END;

$BODY$
LANGUAGE plpgsql VOLATILE

第一个问题是即使 select 语句不返回任何内容(entity_id 不存在),该函数也会返回一个空行(所有值都是空的)。我使用 Dapper 将结果映射到一个对象,我需要知道是否找到该对象(是否为 NULL)。

第二个问题是这个函数总是只返回一行,即使我删除了 WHERE 子句。如果我将函数签名更改为直接从 select 返回查询并删除本地“CustomType”变量,则会返回多行,因此它会按预期工作。

最佳答案

使用 SETOF 和 % ROWTYPE 组合:

/*


drop function my_function(int);

drop table "Table1";

drop type "CustomType";
*/

create type "CustomType" as ("Column1" int, "Column2" int);

create table "Table1"(a int, b int);

insert into "Table1"(a,b) values
(1,2),
(3,4),
(5,6);


CREATE OR REPLACE FUNCTION my_function(entity_id integer)
RETURNS SETOF "CustomType" as
$$
DECLARE
result "CustomType" % rowtype;

singleRow "CustomType";
BEGIN



FOR RESULT IN EXECUTE 'SELECT
t.a,
t.b
FROM "Table1" t
where t.a>= ' || entity_id LOOP

RETURN NEXT RESULT;

END LOOP;

--do other stuff here before returning

singleRow."Column1" := 7;
singleRow."Column2" := 6;

return next singleRow;


RETURN;

END
$$
LANGUAGE plpgsql VOLATILE;


select * from my_function(3)

关于PostgreSQL 在使用自定义类型时只返回一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33143222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com