Как вернуть запись из функции, выполненной по правилу INSERT / UPDATE (триггер)? - PullRequest
1 голос
/ 11 апреля 2010

Сделайте следующую схему для моей базы данных:

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")

Можно ли это как-то исправить?

Спасибо за любые идеи.

Конечная идея - использовать это в других функциях, чтобы я мог получить идентификатор только что вставленной записи, не выбирая ее с нуля. Что-то вроде:

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.

1 Ответ

5 голосов
/ 13 апреля 2010

То, что вы хотите сделать, уже встроено в postgres. Это позволяет вам включить предложение RETURNING в операторы INSERT.

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, прежде чем идти дальше.

...