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 06/02/2017 11:29:38

Geo-x
Membre

cannot perform INSERT RETURNING

Bonjour @ tous.

J'ai créé une vue avec quelques règles associées pour le cas notamment, d'insertions.

Cette règle semble cependant connaître quelques dysfonctionnements puisque je reçois le message d'erreur suivant : ERROR:  cannot perform INSERT RETURNING on relation "view_table" suivi de HINT:  You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause.

Je ne comprends pas ce que cela veut dire. Ma règle d'insertion ressemble à ceci (en simplifié pour vous éviter le gros pavé) :

CREATE OR REPLACE RULE "_INSERT" AS
ON INSERT TO view_table DO INSTEAD  INSERT INTO table (id, wkb_geometry, nom) 
VALUES (new.id, new.wkb_geometry, new.nom);

Avez-vous une idée qui me premettrait de sortir de ce pétrin ?

Par avance merci.

Geo-x

Hors ligne

#2 06/02/2017 12:23:28

ruizsebastien
Membre

Re : cannot perform INSERT RETURNING

Bonjour,

et comme ça est-ce que ça marche :

CREATE OR REPLACE RULE "_INSERT" AS
ON INSERT TO view_table DO INSTEAD  INSERT INTO table (id, wkb_geometry, nom)
VALUES (new.id, new.wkb_geometry, new.nom) RETURNING table.*;

par contre les insert doivent avoir cette forme :

INSERT INTO view_table (id, wkb_geometry, nom) values (1,'blabla', 'blabla') returning id;

Mais je ne garantie pas que ça marche comme ça...

Hors ligne

#3 06/02/2017 12:27:32

Geo-x
Membre

Re : cannot perform INSERT RETURNING

Et malheureusement non, j'ai tenté mais j'ai ce message qui apparait : ERROR:  RETURNING list's entry 30 has different type from column "stat_view"

Si j’interprète correctement, c'est parce qu'il y a dans ma vue des colonnes qu'il n'y a pas dans la table source. Alors j'ai essayé de faire quelque chose du genre

RETURNING table.nom,table.wkb_geometry,(...)

, mais pas mieux...

Les new.col1 renvoient des valeurs type 'blablabla', habituellement ça fonctionne :-)

Hors ligne

#4 06/02/2017 12:34:09

gleu
Administrateur

Re : cannot perform INSERT RETURNING

Pourquoi passez-vous par une règle ? il est connu qu'elles sont très difficiles à écrire correctement et qu'il est nettement préférable de passer par un trigger, beaucoup plus simple à mettre en place et à maintenir.

Hors ligne

#5 06/02/2017 12:36:56

Geo-x
Membre

Re : cannot perform INSERT RETURNING

Bonjour Gleu.
J'utilise les triggers pour les tables uniquement mais pas pour les vues, je ne sais pas forcément comment les utiliser correctement.

Comment feriez-vous ?

Hors ligne

#6 06/02/2017 21:36:05

gleu
Administrateur

Re : cannot perform INSERT RETURNING

Comment est définie la vue ? et quelle est votre version de PostgreSQL ?

Hors ligne

#7 07/02/2017 09:18:23

Geo-x
Membre

Re : cannot perform INSERT RETURNING

J'ai compris d’où venait le problème.
Comme indiqué ma vue reprend des champs de la table mais crée des colonnes supplémentaires en calculant des indicateurs.
La vue doit pouvoir afficher les colonnes concernant ces indicateurs, du coup il faut l'intégrer dnas le RETURNING même si ce sont des valeurs "fantômes" du genre

CREATE OR REPLACE RULE "_INSERT" AS
ON INSERT TO view_table DO INSTEAD  INSERT INTO table (id, wkb_geometry, nom) 
VALUES (new.id, new.wkb_geometry, new.nom)
RETURNING id, wkb_geometry, nom, 0::numeric AS indicateur1, 0::numeric AS indicateur2;

Il est nécessaire d'utiliser la même technique, si la vue comporte également un ON UPDATE.

Geo-x

Hors ligne

Pied de page des forums