2010-04-11 6 views
1

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.

Répondre

5

Ce que vous voulez faire est déjà intégré dans postgres. Il vous permet d'inclure une clause RETURNING sur les instructions 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; 

Si vous sentez que vous devez utiliser une vue, vérifiez this thread sur la liste de diffusion postgres avant d'aller plus loin.

+1

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

Questions connexes