【问题标题】:How to return a record from function, executed by INSERT/UPDATE rule (trigger)?如何从函数返回记录,由 INSERT/UPDATE 规则(触发器)执行?
【发布时间】:2010-04-11 01:57:37
【问题描述】:

为我的数据库执行以下方案:

create sequence data_sequence;

create table data_table
{
    id integer primary key;
    field varchar(100);
};

create view data_view as
select id, field from data_table;

create function data_insert(_new data_view) returns data_view as
$$declare
    _id integer;
    _result data_view%rowtype;
begin
    _id := nextval('data_sequence');
    insert into data_table(id, field) values(_id, _new.field);
    select * into _result from data_view where id = _id;
return _result;
end;
$$
language plpgsql;

create rule insert as on insert to data_view do instead
select data_insert(new);

然后输入psql:

insert into data_view(field) values('abc');

希望看到类似的东西:

 id |  field
----+---------
  1 |  abc

请参阅:

 data_insert
-------------
 (1, "abc")

有没有办法解决这个问题?

感谢您的任何想法。

最终的想法是在其他函数中使用它,这样我就可以获得刚刚插入记录的 id 而无需从头开始选择它。比如:

insert into data_view(field) values('abc') returning id into my_variable

会很好,但不会出现错误:

ERROR:  cannot perform INSERT RETURNING on relation "data_view"
HINT:  You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause.

我不太明白那个提示。我使用的是 PostgreSQL 8.4。

【问题讨论】:

    标签: sql postgresql stored-procedures triggers plpgsql


    【解决方案1】:

    你想要做的已经内置在 postgres 中了。它允许您在 INSERT 语句中包含 RETURNING 子句。

    CREATE TABLE data_table (
        id SERIAL,
        field VARCHAR(100),
        CONSTRAINT data_table_pkey PRIMARY KEY (id)
    );
    
    INSERT INTO data_table (field) VALUES ('testing') RETURNING id, field;
    

    如果您觉得必须使用视图,请先查看 postgres 邮件列表中的 this thread,然后再继续。

    【讨论】:

    • 谢谢。我上面的简化示例与普通插入不同。我的逻辑需要在插入调用(实际上是查看,而不是普通表)和实际物理插入之间进行一些处理,这样的处理还包括决定——是否插入。所以,我想看到的结果是关于插入数据的 1 条记录或没有记录,包括分配的记录 ID。我尝试返回,它给了我上面写的提示。所以,直到我错过了你的答案 - 我仍在寻找解决方案。将查看您的链接 - 谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多