【问题标题】:PostgreSQL returns only one row when using custom typesPostgreSQL 在使用自定义类型时只返回一行
【发布时间】:2015-10-15 08:11:01
【问题描述】:

我有一个返回自定义类型(伪代码)的 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”变量,则返回多行,因此它按预期工作。

【问题讨论】:

    标签: postgresql plpgsql postgresql-9.4


    【解决方案1】:

    使用 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)
    

    【讨论】:

    • 现在可以使用了,谢谢。但是当返回很多行时,使用 LOOP 对查询的性能如何呢?
    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 2013-08-16
    • 2013-07-05
    • 1970-01-01
    • 2021-11-15
    • 2017-10-07
    • 2014-02-27
    • 2016-02-15
    相关资源
    最近更新 更多