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

#1 Re : Général » Vue, clause Returning des règles » 17/09/2013 12:47:54

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

#2 Général » Vue, clause Returning des règles » 17/09/2013 11:19:28

FrancoisM
Réponses : 2

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

Pied de page des forums

Propulsé par FluxBB