【问题标题】:Declare row type variable in PL/pgSQL在 PL/pgSQL 中声明行类型变量
【发布时间】:2015-12-31 00:29:59
【问题描述】:

我发现SELECT * FROM t INTO my_data; 仅在以下情况下有效:

DO $$
DECLARE
my_data t%ROWTYPE;
BEGIN
SELECT * FROM t INTO my_data WHERE id = ?;
END $$;

我说的对吗?

如果我只想获得 2-3 列而不是所有列。如何定义my_data

也就是说,

DO $$
DECLARE
my_data <WHAT HERE??>;
BEGIN
SELECT id,name,surname FROM t INTO my_data WHERE id = ?;
END $$;

【问题讨论】:

    标签: postgresql types plpgsql declare select-into


    【解决方案1】:

    只获取 2-3 列而不是所有列

    一种方法:使用record 变量:

    DO $$
    DECLARE
       _rec record;
    BEGIN
    SELECT INTO _rec
                id, name, surname FROM t WHERE id = ?;
    END $$;
    

    请注意,record 类型的结构在分配之前是未定义的。所以在你这样做之前你不能引用列(字段)。

    另一种方式:分配多个标量变量:

    DO $$
    DECLARE
       _id int;
       _name text;
       _surname text;
    BEGIN
    SELECT INTO _id, _name, _surname
                 id,  name,  surname FROM t WHERE id = ?;
    END $$;
    

    至于您的第一个示例:%ROWTYPE 只是 Postgres 中的噪音。 The documentation:

    (由于每个表都有一个关联的同名复合类型, 在 PostgreSQL 中你是否写 %ROWTYPE 实际上并不重要 或不。但是%ROWTYPE 的表单更便携。)

    所以:

    DO $$
    DECLARE
       my_data t;  -- table name serves as type name, too. 
    BEGIN
       SELECT INTO my_data  * FROM t WHERE id = ?;
    END $$;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多