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 30/12/2020 12:29:40

RémiChairat
Membre

update concatenation champ + row_number

Bonjour,

je dispose d'une table d'ouvrage de protection, et je souhaite créer grâce à un trigger et une fonction un remplissage automatique du champ id_ouvrage en concaténant le champ bassin versant (bv) , code insee (insee)  , et j'aimerai ajouter a la fin un row_number qui permettra de distingué chaque ouvrage qui sont présent dans un même BV et insee.

Voici la fonction créé :

CREATE OR REPLACE FUNCTION ouvrage_v3.id_ouvrage_ca_dracenoise() RETURNS TRIGGER AS
$BODY$BEGIN
update ouvrage_v3.ouv_protec_epci_ca_dracenoise
SET     id_ouvrage = bv||'_'||insee||'_'||row_number
FROM (SELECT ROW_NUMBER() OVER (
		PARTITION BY bv, insee)
		FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise
		) AS row_number;
return new; 
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100; 
ALTER FUNCTION ouvrage_v3.id_ouvrage_ca_dracenoise()
OWNER TO webcarto_w;

le résultat de cette requête ne me convient pas car l’incrémentation ne ce fait pas en effet j'ai toujours un résultat de type bv_insee_1.

Merci par avance pour vos réponses 

Rémi

Dernière modification par RémiChairat (30/12/2020 12:34:29)

Hors ligne

#2 30/12/2020 15:12:36

gleu
Administrateur

Re : update concatenation champ + row_number

En gros, là, vous demandez à la fonction de mettre à jour la colonne id_ouvrage pour toutes les lignes de la table ouv_protec_epci_ca_dracenoise. Or, si j'ai bien compris, vous voulez seulement mettre à jour cette colonne pour la ligne qui déclenche le trigger. Donc il faudra plutôt faire un "NEW.id_ouvrage := une_certaine_valeur". Et "une_certaine_valeur" sera le résultat d'un calcul provenant de la recherche du nombre de lignes partageant le même bassin versant et code insee que la ligne déclenchant le trigger. Ce qui ferait plutôt ce type de code :

SELECT count(*)+1 INTO valeur FROM ouv_protec_epci_ca_dracenoise WHERE bv=NEW.bv et insee=NEW.insee;
NEW.id_ouvrage = bv||'_'||insee||'_'||valeur;

Tout le code n'est pas là, et je peux m'être trompé sur le nom des colonnes. À corriger donc.

En cas de problème, merci de fournir un cas de test complet.


Guillaume.

Hors ligne

#3 30/12/2020 15:34:25

RémiChairat
Membre

Re : update concatenation champ + row_number

Bonjour Guillaume,

Merci pour ton retour, j'essaye de comprendre ta solution mais j'ai l'impression que la fonction count va compter le nombre de valeur égale ? dans mon cas je ne cherche pas à les compter mais à les distinguer a les rendre uniques une numérotation en plus du code bassin versant et du code insee me permet d'avoir des valeurs unique ?

je ne suis pas sur de comprendre votre proposition ?

Hors ligne

#4 31/12/2020 10:34:10

gleu
Administrateur

Re : update concatenation champ + row_number

Apparemment, je n'ai pas compris ce que vous cherchiez à faire, donc il serait mieux que vous repreniez votre explication, votre demande à la base pour qu'on vous aide au mieux.


Guillaume.

Hors ligne

#5 31/12/2020 10:52:30

RémiChairat
Membre

Re : update concatenation champ + row_number

effectivement je n'ai pas du être très clair dans mes explications.

en gros je dispose d'une table avec un champ id_ouvrage ce champ id_ouvrage est composé de la concaténation du champ bassin-versant (bv) du champ code_insee (insee) et j'aimerai afin que celui-ci soit unique et sans doublon pouvoir numéroté les ouvrages ayant un bv et un insee identique afin de les rendre unique.

voila un exemple :
BV_INSEE
X230_83044

et dans de nombreux cas les ouvrages sont disposé sur les mêmes bv et insee donc je me retrouve avec des bv_insee identique

X230_83044
X230_83044
X230_83044

pour remédier à cela j'aimerai pouvoir ajouté une numérotation pour tous les ouvrages qui s'incrémente automatiquement a chaque ajout

X230_83044_1
X230_83044_2
X230_83044_3
X240_83013_1
X241_83044_1
X241_83044_2
X241_83044_3

voila le résultat que j'aimerai obtenir donc dans ma fonction j'ai déjà la concaténation qui ce fait de manière automatique mais j'aimerai rajouter la numérotation automatique d’où le row_number avec PARTITION BY bv, insee afin qu'il recommence la numérotation à chaque changement de bv ou de insee.

j’espère avoir été plus clair cette fois-ci ?

Merci d'avance pour vos retours

Hors ligne

#6 01/01/2021 13:25:31

gleu
Administrateur

Re : update concatenation champ + row_number

C'est très clair et c'est donc bien ce que j'avais compris. Je maintiens donc ma solution si on parle bien d'une fonction trigger qui s'exécutera à chaque insertion.

À l'insertion, le code que je propose va compter le nombre d'éléments contenant déjà le même bv et code insee, ce qui permettra de trouver la séquence suivante pour la numérotation de l'ouvrage. Dans l'exemple donné, pour un bv X230 et un code insee 83044, le SELECT reverra 4 (le nombre d'éléments + 1), ce qui permettra par concaténation d'obtenir X230-83044-4 pour la ligne en cours d'insertion.


Guillaume.

Hors ligne

#7 04/01/2021 09:25:14

RémiChairat
Membre

Re : update concatenation champ + row_number

bonjour et bonne année,

Effectivement cette solution répond à mon problème la fonction count est bel et bien ce que je cherche, par contre je ne comprends pas exactement le into 'valeur' à quoi correspond ce valeur ?

merci pour votre retour

Hors ligne

#8 04/01/2021 10:11:31

gleu
Administrateur

Re : update concatenation champ + row_number

C'est pour stocket temporairement la valeur du résultat du count+1, pour ensuite le concaténer à l'identifiant. J'aurais aussi pu dire :

SELECT bv||'_'||insee||'_'||(count(*)+1)::text FROM ouv_protec_epci_ca_dracenoise WHERE bv=NEW.bv et insee=NEW.insee;

la valeur renvoyée par le SELECT étant maintenant l'identifiant complet.


Guillaume.

Hors ligne

#9 04/01/2021 10:14:50

RémiChairat
Membre

Re : update concatenation champ + row_number

bonjour merci pour l'indication je comprends mieux j'ai cru que valeur représenté une valeur
bref

Hors ligne

#10 05/01/2021 16:53:08

RémiChairat
Membre

Re : update concatenation champ + row_number

Re Bonjour,

après quelques essai je rencontre à nouveau un probléme avec ma fonction :

 CREATE OR REPLACE FUNCTION ouvrage_v3.id_ouvrage_ca_dracenoise() RETURNS TRIGGER AS
$BODY$BEGIN
update ouvrage_v3.ouv_protec_epci_ca_dracenoise
SET     id_ouvrage = bv||'_'||insee||'_'||(SELECT(count(*)+1)::text FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise WHERE bv=NEW.bv and insee=NEW.insee);

END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100; 
ALTER FUNCTION ouvrage_v3.id_ouvrage_ca_dracenoise()
OWNER TO webcarto_w;

et le problème viens après ajout d'un élément j'ai un message qui apparait :

Erreurs de commit:
              ERREUR : 1 attribut non-ajouté.
             
            Erreur du fournisseur de données :
                  Erreur PostGIS lors de l'ajout d'entité : ERROR:  stack depth limit exceeded
                HINT:  Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate.
                CONTEXT:  SQL statement "update ouvrage_v3.ouv_protec_epci_ca_dracenoise
                SET     id_ouvrage = bv||'_'||insee||'_'||(SELECT(count(*)+1)::text FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise WHERE bv=NEW.bv and insee=NEW.insee)"
                PL/pgSQL function ouvrage_v3.id_ouvrage_ca_dracenoise() line 2 at SQL statement
                SQL statement "update ouvrage_v3.ouv_protec_epci_ca_dracenoise
                SET     id_ouvrage = bv||'_'||insee||'_'||(SELECT(count(*)+1)::text FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise WHERE bv=NEW.bv and insee=NEW.insee)"
                PL/pgSQL function ouvrage_v3.id_ouvrage_ca_dracenoise() line 2 at SQL statement
                SQL statement "update ouvrage_v3.ouv_protec_epci_ca_dracenoise
                SET     id_ouvrage = bv||'_'||insee||'_'||(SELECT(count(*)+1)::text FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise WHERE bv=NEW.bv and insee=NEW.insee)"
                PL/pgSQL function ouvrage_v3.id_ouvrage_ca_dracenoise() line 2 at SQL statement
                SQL statement "update ouvrage_v3.ouv_protec_epci_ca_dracenoise
               
               etc etc etc etc etc .......

donc visiblement il tourne en rond quand le trigger ce declanche ..

je ne comprend pas pourquoi et comment eviter qu'il lance en rond la fonction ?

merci d'avance pour votre aide.

Dernière modification par RémiChairat (05/01/2021 16:53:39)

Hors ligne

#11 05/01/2021 17:49:52

gleu
Administrateur

Re : update concatenation champ + row_number

Pourquoi il tourne en rond est asse évident. Comme vous ne nous ave toujours pas fourni d'exemple complet, je vais supposer que vous ave défini ce tirgger sur Je uppose que vous avez défini ce trigger sur la table ouvrage_v3.ouv_protec_epci_ca_dracenoise pour les opérations UPDATE. Donc au premier UPDATE, le trigger se déclenche. La fonction associée au trigger lance un UPDATE sur la même table. Du coup, hop, le trigger se déclenche. Ce qui exécute la fonction qui fait un UPDATE sur la table. Et hop, le trigger se déclenche... et ainsi de suite, il n'en finit jamais. Ou plus exactement, il finit par s'arrêter parce que la limite de la pile d'appel est atteinte.

La documentation l'indique bien. Il ne faut pas faire un UPDATE de la table, mais changer la valeur du champ. Du coup, ça devrait donner ceci comme définition de fonction, encore une fois sans aucune garantie parce que, encore une fois, vous ne nous avez toujours pas donné d'exemple complet :

CREATE OR REPLACE FUNCTION ouvrage_v3.id_ouvrage_ca_dracenoise() RETURNS TRIGGER AS
$BODY$BEGIN
NEW.id_ouvrage = bv||'_'||insee||'_'||(SELECT(count(*)+1)::text FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise WHERE bv=NEW.bv and insee=NEW.insee);
RETURN NEW;
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100; 

De plus, vous aviez oublié le RETURN NEW.


Guillaume.

Hors ligne

#12 05/01/2021 17:56:15

RémiChairat
Membre

Re : update concatenation champ + row_number

re Bonjour et merci pour votre réponse,

Juste pour info je ne comprends pas ce que vous attendez comme exemple complet un export de ma base ?

cordialement,

Rémi

Hors ligne

#13 05/01/2021 23:31:11

gleu
Administrateur

Re : update concatenation champ + row_number

Toutes les requêtes permettant de rejouer votre exemple de trigger, de manière à tester nous même et corriger, en s'assurant que la correction convienne. Voilà un exemple :

CREATE SCHEMA ouvrage_v3;
CREATE TABLE ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv text, insee text, id_ouvrage text);
CREATE FUNCTION ouvrage_v3.generate_id_ouvrage() RETURNS TRIGGER AS
$BODY$
BEGIN
NEW.id_ouvrage = NEW.bv||'_'||NEW.insee||'_'||(SELECT(count(*)+1)::text FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise WHERE bv=NEW.bv and insee=NEW.insee);
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER tr1
  BEFORE INSERT OR UPDATE ON ouvrage_v3.ouv_protec_epci_ca_dracenoise
  FOR EACH ROW EXECUTE FUNCTION ouvrage_v3.generate_id_ouvrage();
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee) VALUES ('X230', '83044');
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee) VALUES ('X230', '83044');
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee) VALUES ('X240', '83013');
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee) VALUES ('X241', '83044');
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee) VALUES ('X241', '83044');
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee) VALUES ('X241', '83044');
SELECT * FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise;

Ce qui donne comme résultat :

CREATE SCHEMA
CREATE TABLE
CREATE FUNCTION
CREATE TRIGGER
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
┌──────┬───────┬──────────────┐
│  bv  │ insee │  id_ouvrage  │
├──────┼───────┼──────────────┤
│ X230 │ 83044 │ X230_83044_1 │
│ X230 │ 83044 │ X230_83044_2 │
│ X240 │ 83013 │ X240_83013_1 │
│ X241 │ 83044 │ X241_83044_1 │
│ X241 │ 83044 │ X241_83044_2 │
│ X241 │ 83044 │ X241_83044_3 │
└──────┴───────┴──────────────┘
(6 rows)

Ce qui m'a permis de remarquer que je m'étais trompé dans le code de la fonction. Et qu'après correction, que ma nouvelle proposition fonctionnait.


Guillaume.

Hors ligne

#14 05/01/2021 23:33:05

gleu
Administrateur

Re : update concatenation champ + row_number

Ah, et pour répondre sur l'export complet de la base, non parce que trop gros, et potentiellement contenant des informations à ne pas divulguer. Un exemple simple montrant le problème et pouvant le reproduire, comme celui montré dans mon commentaire précédent.


Guillaume.

Hors ligne

#15 06/01/2021 12:48:00

RémiChairat
Membre

Re : update concatenation champ + row_number

Re bonjour gleu et encore merci pour votre retour,

Cependant je rencontre encore un dernier problème en effet cela ne fonctionne pas, mon champ id_ouvrage reste vide a l'ajout d'une ligne. et je pense que le problème vient du fait que mon champ id_ouvrage a déjà été complété manuellement jusqu'à maintenant.

donc en gros ma table sans ajout de base est identique à la table suivante que vous avez créé dans le post précédent (cette table est une table que j'ai récupéré existante et jusqu’à maintenant remplie manuellement)   :

┌──────┬───────┬──────────────┐
│  bv  │ insee │  id_ouvrage  │
├──────┼───────┼──────────────┤
│ X230 │ 83044 │ X230_83044_1 │
│ X230 │ 83044 │ X230_83044_2 │
│ X240 │ 83013 │ X240_83013_1 │
│ X241 │ 83044 │ X241_83044_1 │
│ X241 │ 83044 │ X241_83044_2 │
│ X241 │ 83044 │ X241_83044_3 │
└──────┴───────┴──────────────┘

et c'est a partir de cette table que je souhaiterai que à chaque ajout l’incrémentation ce continue.

j’espère que mes explications sont clair ???

en gros dans l'exemple de votre post précédent il faudrait commencer par créer la table avec les valeurs déjà à l’intérieur

 
CREATE SCHEMA ouvrage_v3;
CREATE TABLE ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv text, insee text, id_ouvrage text);
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee, id_ouvrage) VALUES ('X230', '83044', 'X230_83044_1');
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee, id_ouvrage) VALUES ('X230', '83044', 'X230_83044_2');
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee, id_ouvrage) VALUES ('X240', '83013', 'X240_83013_1');
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee, id_ouvrage) VALUES ('X241', '83044', 'X241_83044_1');
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee, id_ouvrage) VALUES ('X241', '83044','X241_83044_2');
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise (bv, insee, id_ouvrage) VALUES ('X241', '83044','X241_83044_3');
SELECT * FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise;

qui correspond à ma table de base que j'ai récupéré et a partir de cette table je souhaiterai que à chaque ajout la numérotation ce poursuive
ce qui n'est pas le cas actuellement.

cordialement,

Rémi

Hors ligne

#16 06/01/2021 18:03:19

gleu
Administrateur

Re : update concatenation champ + row_number

Ça manque d'un exemple complet montrant le problème parce que, pour moi, ça marche :

INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise VALUES ('X241', '83044', 'prout');
INSERT INTO ouvrage_v3.ouv_protec_epci_ca_dracenoise VALUES ('X230', '83044', 'prout2');
TABLE ouvrage_v3.ouv_protec_epci_ca_dracenoise ;
┌──────┬───────┬──────────────┐
│  bv  │ insee │  id_ouvrage  │
├──────┼───────┼──────────────┤
│ X230 │ 83044 │ X230_83044_1 │
│ X230 │ 83044 │ X230_83044_2 │
│ X240 │ 83013 │ X240_83013_1 │
│ X241 │ 83044 │ X241_83044_1 │
│ X241 │ 83044 │ X241_83044_2 │
│ X241 │ 83044 │ X241_83044_3 │
│ X241 │ 83044 │ X241_83044_4 │
│ X230 │ 83044 │ X230_83044_3 │
└──────┴───────┴──────────────┘
(8 rows)

Guillaume.

Hors ligne

#17 07/01/2021 12:08:06

RémiChairat
Membre

Re : update concatenation champ + row_number

re Bonjour,

Je vais essayer d'etre le plus clair possible avec de nombreux exemple car j'ai oublié de parler de pas mal de points qui me semblaient pas utile car tout fonctionner mais je pense que cela doit avoir un lien avec mon problème final.

mon schema ouvrage_v3 est composé de trois tables :

        - ouv_protec_epci_ca_dracenoise (couche linéaire)
        - commune (couche surfacique)
        - hydro_zone (couche surfacique)

 
CREATE TABLE ouvrage_v3.communes (insee text, geom);
INSERT INTO ouvrage_v3.communes (insee) VALUES ('83044');
INSERT INTO ouvrage_v3.communes (insee) VALUES ('83013');

CREATE TABLE ouvrage_v3.hydro_zone (bv text, geom);
INSERT INTO ouvrage_v3.hydro_zone (insee) VALUES ('X230');
INSERT INTO ouvrage_v3.hydro_zones (insee) VALUES ('X240');

ces 2 tables vont me permettre grâce a deux trigger précédemment créés d'aller prendre les codes insee et bv utilisés dans la table  "ouvrage_v3.ouv_protec_epci_ca_dracenoise"

trigger et fonction pour le bv :

CREATE OR REPLACE FUNCTION ouvrage_v3.bv_ca_dracenoise()
  RETURNS trigger AS
$BODY$BEGIN
update ouvrage_v3.ouv_protec_epci_ca_dracenoise
SET     bv =
           (SELECT  hydro_zone.code_zone::text
            FROM   ouvrage_v3.hydro_zone
            WHERE   St_Intersects(hydro_zone.geom, ouv_protec_epci_ca_dracenoise.geom)) ;
return NEW; 
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION ouvrage_v3.bv_ca_dracenoise()
  OWNER TO webcarto_w;

CREATE TRIGGER a_bv_dracenoise
  AFTER INSERT
  ON ouvrage_v3.ouv_protec_epci_ca_dracenoise
  FOR EACH ROW
  EXECUTE PROCEDURE ouvrage_v3.bv_ca_dracenoise();

trigger et fonction pour le code insee :

CREATE OR REPLACE FUNCTION ouvrage_v3.insee_ca_dracenoise()
  RETURNS trigger AS
$BODY$BEGIN
update ouvrage_v3.ouv_protec_epci_ca_dracenoise
SET  insee =
           (SELECT  commune.code_insee
            FROM   ouvrage_v3.commune
            WHERE   St_Intersects(commune.geom, ouv_protec_epci_ca_dracenoise.geom)) ;
return new; 
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION ouvrage_v3.insee_ca_dracenoise()
  OWNER TO webcarto_w;


CREATE TRIGGER b_insee_dracenoise
  AFTER INSERT
  ON ouvrage_v3.ouv_protec_epci_ca_dracenoise
  FOR EACH ROW
  EXECUTE PROCEDURE ouvrage_v3.insee_ca_dracenoise();

ces deux trigger fonctionne parfaitement j'ai à chaque ajout d'ouvrage le code insee et le code bv qui sont automatiquement rempli dans les champs correspondant de la table ouv_protec_epci_ca_dracenoise

mais le dernier trigger et fonction sur lequel nous avons discuter jusqu’à maintenant :

CREATE OR REPLACE FUNCTION ouvrage_v3.id_ouvrage_ca_dracenoise()
  RETURNS trigger AS
$BODY$
BEGIN
NEW.id_ouvrage = NEW.bv||'_'||NEW.insee||'_'||(SELECT(count(*)+1)::text FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise WHERE bv=NEW.bv and insee=NEW.insee and id_ouvrage=NEW.id_ouvrage);
RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION ouvrage_v3.id_ouvrage_ca_dracenoise()
  OWNER TO postgres;

CREATE TRIGGER c_ca_dracenoise
  AFTER INSERT
  ON ouvrage_v3.ouv_protec_epci_ca_dracenoise
  FOR EACH ROW
  EXECUTE PROCEDURE ouvrage_v3.id_ouvrage_ca_dracenoise();

Cette fonction et ce trigger ne me renvoi aucun message d'erreur mais le champ 'id_ouvrage' de la table 'ouv_protec_epci_ca_dracenoise' ne se rempli pas.

pour info j'ai essayé de mettre un exemple de geom à rajouter au table commune et hydro_zone mais je me suis retrouvé avec une séquence de caractère de 100 lignes.

Voilà je pense avoir était le plus clair possible j’espère vous avoir données suffisamment d'informations si il y a un manque ne pas hésiter à me prévenir

merci d'avance pour vos retours

Rémi

Hors ligne

#18 07/01/2021 14:31:28

gleu
Administrateur

Re : update concatenation champ + row_number

Déjà, merci beaucoup pour avoir fait l'effort de ce long texte et de ces exemples. Mais il y a un gros problème. Dès le départ, le premier script ne pourra pas s'exécuter correctement :

CREATE TABLE ouvrage_v3.communes (insee text, geom);  -- ce CREATE ne peut pas fonctionner, il manque à priori le nom de la colonne de type geom
INSERT INTO ouvrage_v3.communes (insee) VALUES ('83044');
INSERT INTO ouvrage_v3.communes (insee) VALUES ('83013');

CREATE TABLE ouvrage_v3.hydro_zone (bv text, geom); -- pareil pour ce CREATE
INSERT INTO ouvrage_v3.hydro_zone (insee) VALUES ('X230');
INSERT INTO ouvrage_v3.hydro_zones (insee) VALUES ('X240'); -- la table s'appelle hydrozone, sans s

Ces deux petites fautes ne sont pas graves, mais je ne vais pas perdre du temps à vérifier tout le reste du code. Merci de vérifier votre code et de corriger tout ça avant qu'on puisse vous aider réellement. Merci.


Guillaume.

Hors ligne

#19 07/01/2021 14:36:05

gleu
Administrateur

Re : update concatenation champ + row_number

Ah, j'oubliais aussi que la table ouvrage_v3.hydro_zone est déclarée avec une colonne bv, mais que le INSERT se fait sur une colonne insee. Il faut tester son jeu de tests pour s'assurer que tout sera reproductible.


Guillaume.

Hors ligne

#20 07/01/2021 14:45:09

RémiChairat
Membre

Re : update concatenation champ + row_number

pardon je ne voulais encombré les exemple avec des creation de table complet et très lourd voici les script des deux tables :

table commune :

CREATE TABLE ouvrage_v3.commune
(
  gid serial NOT NULL,
  id character varying(24),
  prec_plani double precision,
  nom character varying(45),
  code_insee character varying(5),
  statut character varying(22),
  arrondisst character varying(45),
  depart character varying(30),
  region character varying(35),
  popul integer,
  geom geometry(MultiPolygon),
  CONSTRAINT commune_pkey PRIMARY KEY (gid)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE ouvrage_v3.commune
  OWNER TO webcarto_w;

-- Index: ouvrage_v3.commune_geom_idx

-- DROP INDEX ouvrage_v3.commune_geom_idx;

CREATE INDEX commune_geom_idx
  ON ouvrage_v3.commune
  USING gist
  (geom);

table hydro_zone :

CREATE TABLE ouvrage_v3.hydro_zone
(
  gid serial NOT NULL,
  code_zone character varying(4),
  libelle character varying(125),
  pkhexut numeric(10,0),
  id_bdcarth numeric(10,0),
  code_hydro character varying(8),
  libelle_so character varying(125),
  libelle_se character varying(125),
  libelle_re character varying(125),
  geom geometry(MultiPolygon),
  CONSTRAINT hydro_zone_pkey PRIMARY KEY (gid)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE ouvrage_v3.hydro_zone
  OWNER TO webcarto_w;

-- Index: ouvrage_v3.hydro_zone_geom_idx

-- DROP INDEX ouvrage_v3.hydro_zone_geom_idx;

CREATE INDEX hydro_zone_geom_idx
  ON ouvrage_v3.hydro_zone
  USING gist
  (geom);

pour le remplissage des champs et notamment le champ geom je me retrouve face a une succession  de caractère très très longue je pense que je risque de saturer complétement la page du forum avec cette longue chaine de caractère.
si vous le souhaitez je vous envoi les couches en question afin que vous puissiez reproduire la création de base avec postgresql / postgis

Cordialement,

Rémi

Hors ligne

#21 07/01/2021 14:47:45

RémiChairat
Membre

Re : update concatenation champ + row_number

gleu a écrit :

Ah, j'oubliais aussi que la table ouvrage_v3.hydro_zone est déclarée avec une colonne bv, mais que le INSERT se fait sur une colonne insee. Il faut tester son jeu de tests pour s'assurer que tout sera reproductible.

oui pardon en voulant simplifier je me suis trompé dans mon copié coller il faut utiliser les creats envoyé dans le dernier message

Hors ligne

#22 07/01/2021 16:22:35

dverite
Membre

Re : update concatenation champ + row_number

Cette fonction et ce trigger ne me renvoi aucun message d'erreur mais le champ 'id_ouvrage' de la table 'ouv_protec_epci_ca_dracenoise' ne se rempli pas.

Votre trigger en message #17 fait ça:

NEW.id_ouvrage = NEW.bv||'_'||NEW.insee||'_'||(SELECT(count(*)+1)::text FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise WHERE bv=NEW.bv and insee=NEW.insee and id_ouvrage=NEW.id_ouvrage);

La partie

and id_ouvrage=NEW.id_ouvrage

n'a pas de sens puisqu'elle cherche une valeur qui n'est pas encore remplie. Regardez bien ce qu'a proposé Guillaume en #11, il n'y avait pas cette condition.

Hors ligne

#23 07/01/2021 16:24:18

RémiChairat
Membre

Re : update concatenation champ + row_number

dverite a écrit :

Cette fonction et ce trigger ne me renvoi aucun message d'erreur mais le champ 'id_ouvrage' de la table 'ouv_protec_epci_ca_dracenoise' ne se rempli pas.

Votre trigger en message #17 fait ça:

NEW.id_ouvrage = NEW.bv||'_'||NEW.insee||'_'||(SELECT(count(*)+1)::text FROM ouvrage_v3.ouv_protec_epci_ca_dracenoise WHERE bv=NEW.bv and insee=NEW.insee and id_ouvrage=NEW.id_ouvrage);

La partie

and id_ouvrage=NEW.id_ouvrage

n'a pas de sens puisqu'elle cherche une valeur qui n'est pas encore remplie. Regardez bien ce qu'a proposé Guillaume en #11, il n'y avait pas cette condition.

effectivement erreur de ma part je corriges

Hors ligne

Pied de page des forums