PostgreSQL returns 使用自定义类型时只有一行
PostgreSQL returns only one row when using custom types
我有一个 plpgsql 函数,它 return 是一个自定义类型(伪代码):
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
第一个问题是函数 return 是一个空行(所有值都是空的),即使 select 语句 return 没有(entity_id 没有存在)。
我使用 Dapper 将结果映射到一个对象,我需要知道是否找到该对象(是否为 NULL)。
第二个问题是这个函数总是return只有一行,即使例如我删除了 WHERE 子句。
如果我将函数签名更改为直接从 select 查询 return 并删除本地 "CustomType" 变量,则多行被 returned,因此它按预期工作。
使用 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)
我有一个 plpgsql 函数,它 return 是一个自定义类型(伪代码):
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
第一个问题是函数 return 是一个空行(所有值都是空的),即使 select 语句 return 没有(entity_id 没有存在)。 我使用 Dapper 将结果映射到一个对象,我需要知道是否找到该对象(是否为 NULL)。
第二个问题是这个函数总是return只有一行,即使例如我删除了 WHERE 子句。 如果我将函数签名更改为直接从 select 查询 return 并删除本地 "CustomType" 变量,则多行被 returned,因此它按预期工作。
使用 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)