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

#1 Re : PL/pgSQL » update concatenation champ + row_number » 07/01/2021 16:24:18

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

#2 Re : PL/pgSQL » update concatenation champ + row_number » 07/01/2021 14:47:45

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

#3 Re : PL/pgSQL » update concatenation champ + row_number » 07/01/2021 14:45:09

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

#4 Re : PL/pgSQL » update concatenation champ + row_number » 07/01/2021 12:08:06

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

#5 Re : PL/pgSQL » update concatenation champ + row_number » 06/01/2021 12:48:00

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

#6 Re : PL/pgSQL » update concatenation champ + row_number » 05/01/2021 17:56:15

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

#7 Re : PL/pgSQL » update concatenation champ + row_number » 05/01/2021 16:53:08

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.

#8 Re : PL/pgSQL » update concatenation champ + row_number » 04/01/2021 10:14:50

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

#9 Re : PL/pgSQL » update concatenation champ + row_number » 04/01/2021 09:25:14

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

#10 Re : PL/pgSQL » update concatenation champ + row_number » 31/12/2020 10:52:30

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

#11 Re : PL/pgSQL » update concatenation champ + row_number » 30/12/2020 15:34:25

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 ?

#12 PL/pgSQL » update concatenation champ + row_number » 30/12/2020 12:29:40

RémiChairat
Réponses : 22

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

Pied de page des forums

Propulsé par FluxBB