如何从INSERT/UPDATE规则(触发器)执行的函数返回记录?

sea*_*eas 1 sql postgresql triggers stored-procedures plpgsql

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

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);
Run Code Online (Sandbox Code Playgroud)

然后输入psql:

insert into data_view(field) values('abc');
Run Code Online (Sandbox Code Playgroud)

想看到类似的东西:

 id |  field
----+---------
  1 |  abc
Run Code Online (Sandbox Code Playgroud)

相反看:

 data_insert
-------------
 (1, "abc")
Run Code Online (Sandbox Code Playgroud)

有可能以某种方式解决这个问题吗?

谢谢你的任何想法.

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

insert into data_view(field) values('abc') returning id into my_variable
Run Code Online (Sandbox Code Playgroud)

会很好,但不能与错误一起使用:

ERROR:  cannot perform INSERT RETURNING on relation "data_view"
HINT:  You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause.
Run Code Online (Sandbox Code Playgroud)

我真的不明白那个提示.我使用PostgreSQL 8.4.

h0t*_*1r3 5

你想做的事已经内置到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;
Run Code Online (Sandbox Code Playgroud)

如果您认为必须使用视图,请在postgres邮件列表中查看此主题,然后再继续操作.