选择并传递记录作为函数参数

时间:2016-01-08 15:28:15

标签: sql postgresql plpgsql

它可能看起来像是现有问题的重复(例如This one),但它们只涉及传递" new"参数,而不是从数据库中选择行。

我有一张桌子,例如:

var pipeline = [
    {
        "$match": {
            "type": {
                "$in": ['mobile','voip']
            },
            "process_time": {
                "$gte": start_date,
                "$lte": end_date
            }
        }
    },
    {
        "$group": {
            "_id": null
            "total_duration": { "$sum": "$duration" }
        }
    }
]

var linkNames = db.lines.aggregate(pipeline).toArray();
if (linkNames.length > 0) { printjson (linkNames[0].total_duration); }

一个功能:

CREATE TABLE my_table (
    id bigserial NOT NULL,
    name text,
    CONSTRAINT my_table_pkey PRIMARY KEY (id)
);

我想在数据库中已存在的数据上运行它。如果我想从另一个PL / pgSQL存储过程中使用它,那没问题,例如:

CREATE FUNCTION do_something(row_in my_table) RETURNS void AS
$$
BEGIN
    -- does something
END;
$$
LANGUAGE plpgsql;

但是,我不知道如何使用"普通"查询,例如

-- ...
SELECT * INTO row_var FROM my_table WHERE id = 123; -- row_var is of type my_table%rowtype
PERFORM do_something(row_var);
-- ...

有没有办法执行这样的查询?

1 个答案:

答案 0 :(得分:3)

您需要将标量记录传递给该函数,这需要将实际选择括在另一对括号中:

SELECT do_something( (SELECT * FROM my_table WHERE id = 123) );

但是上面的 NOT 工作,因为该函数只需要单个列(类型为my_table的记录),而select *会返回多列(与具有多个字段的单个记录不同)。

要从select中返回记录,您需要使用以下语法:

SELECT do_something( (SELECT my_table FROM my_table WHERE id = 123) );

请注意,如果您不确保select只返回一行,则可能仍会失败。

如果要将该函数应用于多行,可以这样做:

select do_something(my_table)
from my_table;