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

标签 sql postgresql stored-procedures triggers 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);

然后输入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。

最佳答案

你想做的事情已经内置到 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;

如果您觉得必须使用 View ,请检查 this thread在继续之前在 postgres 邮件列表上。

关于sql - 如何从由 INSERT/UPDATE 规则(触发器)执行的函数返回记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2615780/

相关文章:

java - 创建 SQL 查询以从名义上形成的数据库返回值

javascript - 当我使用belongsToMany 关联时,Sequelize 中的自动预加载

arrays - Postgres : How to return an integer array from stored function

mysql - 如何从查询中选择第一行到 MySQL 中的过程变量

sql - MySQL - NULL 值检查和存储过程中的动态 SQL

php - Mysql查询空值不包含在where条件中

mysql - 查询更改为将字段作为参数传递,并且不再有效

php - 如何防止 PrestaShop 在订单验证后更新产品数量

java - PostgreSQL View 读取另一个表,转换数据并返回结果

mysql - 无法创建存储过程