【问题标题】:How to declare an array of rowtype in a PostgreSQL function?如何在 PostgreSQL 函数中声明行类型数组?
【发布时间】:2014-03-10 17:12:36
【问题描述】:

我正在尝试创建一个 PostgreSQL 函数,在其中我将遍历查询的行并将其中一些存储在一个数组中,然后再用它做更多的事情。如何创建行类型数组?

CREATE OR REPLACE FUNCTION forExample() RETURNS integer AS
$BODY$
DECLARE
    r "WEBHOST"%rowtype;
    b "WEBHOST"%rowtype[];   <- This does not work !!!
BEGIN
    FOR r IN SELECT * FROM "WEBHOST"
    LOOP
        array_append(b, r);
    END LOOP;
    RETURN 33;
END
$BODY$
LANGUAGE 'plpgsql';

上面的函数会比较复杂,但是我为这个问题提供了一个简化的版本。

【问题讨论】:

    标签: arrays function postgresql aggregate-functions plpgsql


    【解决方案1】:
    CREATE OR REPLACE FUNCTION for_example()
      RETURNS integer AS
    $func$
    DECLARE
       r "WEBHOST";
       b "WEBHOST"[];         -- this works
    BEGIN
       FOR r IN 
          SELECT * FROM "WEBHOST"
       LOOP
          b := b || r;        -- this, too
       END LOOP;
    
       RAISE NOTICE '%', b;   -- get feedback
       RETURN 33;
    END
    $func$  LANGUAGE plpgsql; -- and lose the quotes
    

    %rowtype 通常不需要。通常,表的关联行类型可用作同名类型。

    并且不要引用语言名称。

    您不能只在plpgsql 中进行独立的函数调用。改为使用作业。

    在 Postgres 中使用 CaMeL 大小写标识符也不是一个好主意。使用合法的小写标识符让您的生活更轻松。

    最后的最佳选择:使用聚合函数array_agg() 可以更简单:

    CREATE OR REPLACE FUNCTION for_example()
      RETURNS integer AS
    $func$
    DECLARE
       b "WEBHOST"[];
    BEGIN
       SELECT array_agg(tbl) INTO b FROM "WEBHOST" tbl;       
    
       RAISE NOTICE '%', b;
       RETURN 33;
    END
    $func$  LANGUAGE plpgsql;
    

    【讨论】:

    • 嗨,它有点旧,但我需要定义可以插入数据的变量,然后删除它并插入新的等等......我想使用你的解决方案,但 postgres 给我编译错误类型“my_schema .my_tbl[]" 不存在。你能帮帮我吗?
    • @DenisStephanov:不确定我是否理解。无论如何,请将其发布为新问题。评论不是地方。您可以随时在此处链接以获取上下文或在此处添加评论以链接回。
    猜你喜欢
    • 2015-10-07
    • 2014-12-08
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多