PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 17/09/2013 11:19:28

FrancoisM
Membre

Vue, clause Returning des règles

Bonjour à tous,

Je commence à prendre en main Postgresql, qui me satisfait en tout points jusqu'ici, je tiens donc tout d'abord à remercier toute la communauté pour ce travail.

Ma question:

Sur une vue comportant des jointures, j'essaye d'ajouter des règles afin de pouvoir la rendre modifiable.

Je bute sur l'ajout d'une clause returning dans la règle sur INSERT.

Voici le code de cette règle:

CREATE OR REPLACE RULE personne_ins AS
    ON INSERT TO personnes DO INSTEAD ( INSERT INTO addresses (id, location, line_1, line_2, line_3, code_postal, ville) 
  VALUES (DEFAULT, 'Principale'::character varying, new.line_1, new.line_2, new.line_3, new.code_postal, new.ville);
 INSERT INTO emails (id, name, address) 
  VALUES (DEFAULT, 'Principal'::character varying, new.address);
 INSERT INTO actors (id, id_quality, main_address, main_email) 
  VALUES (DEFAULT, new.id_quality, currval('adresses_id_seq'::regclass), currval('emails_id_seq'::regclass));
 INSERT INTO persons (id, name, firstname, birthday, prefixe) 
  VALUES (currval('actors_id_seq'::regclass), new.name, new.firstname, new.birthday, new.prefixe);
 INSERT INTO actors_addresses (id_actor, id_address) 
  VALUES (currval('actors_id_seq'::regclass), currval('adresses_id_seq'::regclass));
 INSERT INTO actors_emails (id_actor, id_email) 
  VALUES (currval('actors_id_seq'::regclass), currval('emails_id_seq'::regclass));

  	RETURNING
		 SELECT actors.id, actors.id_quality, persons.prefixe, persons.firstname, 
		    persons.name, persons.birthday, emails.id AS main_email, emails.address, 
		    addresses.id AS main_address, addresses.line_1, addresses.line_2, 
		    addresses.line_3, addresses.code_postal, addresses.ville
		   FROM actors
		   JOIN persons ON persons.id = actors.id
		   JOIN addresses ON addresses.id = actors.main_address
		   JOIN emails ON emails.id = actors.main_email
		   WHERE actors.id = currval('actors_id_seq'::regclass);

);

Et le message d'erreur de syntaxe:

ERROR:  syntax error at or near "RETURNING"
LINE 15:    RETURNING

Comment ajouter correctement cette clause, ou est-ce préférable dans ce cas d'utiliser un trigger?

D'avance merci,
François

Hors ligne

#2 17/09/2013 11:28:45

rjuju
Administrateur

Re : Vue, clause Returning des règles

Bonjour,

depuis la version 9.1 vous pouvez utiliser des triggers sur des vues, ce qui est bien plus conseillé que l'utilisation de règles.


RETURNING est une clause pour les requêtes de type insert,update et delete pas un ordre à part entière. Je ne vois d'ailleurs pas trop ce que vous cherchez à faire exactement.

Hors ligne

#3 17/09/2013 12:47:54

FrancoisM
Membre

Re : Vue, clause Returning des règles

Merci pour cette réponse rapide.


Je cherchais pouvoir supporter une clause returning dans les inserts sur la vue, ainsi indiqué dans la doc:

Si vous voulez supporter les requêtes RETURNING sur la vue, vous devrez faire en sorte que les règles incluent les clauses RETURNING qui calcule les lignes de la vue. Ceci est assez simple pour des vues sur une seule table mais cela devient rapidement complexe pour des vues de jointure comme lacet.

L'exemple cité dans la doc ne comportait qu'un seul insert, mais sachant qu'on pouvait avoir plusieurs commandes dans le DO d'une règle je pensais que dans le cas d'une règle on pouvait utiliser un returning global. Apparemment on ne peut pas...


En général, sur un nouvel outil, j'essaye d'en cerner le fonctionnement.

C'est fait pour cette question, merci.


François

Hors ligne

Pied de page des forums