Est-ce que le schéma suivant pour ma base de données:Comment renvoyer un enregistrement de la fonction, exécuté par la règle INSERT/UPDATE (trigger)?
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);
Ensuite, tapez psql:
insert into data_view(field) values('abc');
aimerait voir quelque chose comme:
id | field
----+---------
1 | abc
voir lieu:
data_insert
-------------
(1, "abc")
Est-il possible de résoudre ce problème?
Merci pour vos idées.
L'idée ultime est de l'utiliser dans d'autres fonctions, de sorte que je puisse obtenir l'ID de l'enregistrement inséré juste sans le sélectionner à partir de zéro. Quelque chose comme:
insert into data_view(field) values('abc') returning id into my_variable
serait bien mais ne fonctionne pas avec l'erreur:
ERROR: cannot perform INSERT RETURNING on relation "data_view"
HINT: You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause.
Je ne comprends pas vraiment Hint. J'utilise PostgreSQL 8.4.
Merci. Mon exemple simplifié ci-dessus est différent d'une insertion simple. Ma logique nécessite un certain traitement entre l'invocation d'insertion (en fait, pour voir, pas une table plaine), et l'insertion physique réelle, un tel traitement comprend également la décision - d'insérer ou non. Donc, le résultat que je voudrais voir est 1 ou aucun enregistrement sur les données insérées, y compris l'ID d'enregistrement attribué. Et j'ai essayé de RETOURNER, et il m'a donné un indice comme écrit ci-dessus. Donc, jusqu'à ce que j'ai raté quelque chose dans votre réponse - je cherche toujours une solution. Revoir votre lien - merci. – seas