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

#176 Re : PL/pgSQL » mise à jour buffer table1 depuis geometrie table 2 » 21/09/2011 08:53:59

Bonjour Gleu,

merci pour votre piste, j'ai essayé quelque chose mai sans plus de succès :

CREATE OR REPLACE FUNCTION update_buffer1()
  RETURNS trigger AS $BODY$
  
  DECLARE
  buff RECORD;

BEGIN
	
	SELECT INTO buff foo.contrainte,foo.wkb_geometry,buffer1
	FROM table1 ,dblink('hostaddr=xxx.x.x.x port=xxxx dbname=name user=xxxxx password=xxxx', 
	'SELECT wkb_geometry,contrainte_emprise1 FROM table2')
	AS foo(wkb_geometry geometry,contraintedouble precision);
	
	buff.buffer1=buffer(buff.wkb_geometry,buff.contrainte);
	NEW.buffer1=buff.buffer1;

	RETURN NEW;

END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION update_buffer1() OWNER TO postgres;

CREATE TRIGGER update_buffer1
  BEFORE INSERT OR UPDATE
  ON table2
  FOR EACH ROW
  EXECUTE PROCEDURE update_buffer1();

En message d'erreur il me met : Record 'new' has no field 'buffer1', alors j'ai essayé entre la fin de la première requête et le return new de mettre quelque chose comme ça (j'ai essayé différentes variantes):

SELECT buffer1 FROM buffer_reseau
NEW.buffer1=buff.buffer1;

Mais ça ne marche pas plus...
concernant le dblink, y a-t-il une autre alternative à moins de modifier la structure des tables?

Merci d'avance.

#177 PL/pgSQL » mise à jour buffer table1 depuis geometrie table 2 » 20/09/2011 17:09:20

Geo-x
Réponses : 10

Et une impasse ne venant jamais seule,

je viens vers vous parce que j'essaie de mettre en place une mise à jour automatique d'un buffer (dans table1) à partir de la géométrie d'un reseau (table2)

En clair j'aimerais lors de la mise à jour et et/ou l'insertion d'un reseau, le buffer associé se mette à jour dans l'autre table.

table1 (geom_buffer1 geometry)
table2 (wkb_geometry geometry, contrainte integer)

Voici pour le moment le code que j'ai développé :

CREATE OR REPLACE FUNCTION update_buffer1()
  RETURNS trigger AS $BODY$

BEGIN
	
	SELECT foo.contrainte,foo.wkb_geometry,geom_buffer1
	FROM table1 ,dblink('hostaddr=xxx.x.x.x port=xxxx dbname=name user=xxxxx password=xxxx, 
	'SELECT wkb_geometry,contrainte FROM table2' )
	AS foo(wkb_geometry geometry,contrainte integer);
	
	NEW.geom_buffer1=buffer(foo.wkb_geometry,foo.contrainte);

	RETURN NEW;

END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION update_buffer1() OWNER TO postgres;

CREATE TRIGGER update_buffer1
  BEFORE INSERT OR UPDATE
  ON table2 
  FOR EACH ROW
  EXECUTE PROCEDURE update_buffer1();

Là c'est (une fois de plus) le vide absolu après avoir essayé une dizaine de choses différentes. A chaque fois j'ai l'impression de pas être loin mais je ne trouve pas le truc qu'il manque :-(

Merci de votre aide si vous avez une idée.

#178 PL/pgSQL » trigger character 'DD/MM/YYYY' to timestamp » 20/09/2011 15:17:49

Geo-x
Réponses : 6

Bonjour tout le monde,

cela faisait un petit bout de temps que je n'étais pas venu vous voir, mais pendant ce temps j'ai continué à développer des petits trigger, et aujourd'hui, je bloque sur un trigger qui modifierait une suite de caractères au format timestamp without time zone.

cette suite de caractères (champ_source) est constitué de la sorte ex. : 29/01/2001

Pour ça, j'ai trouvé la fonction : to_timestamp(champ_source,'DD/MM/YYYY')
qui modifie correctement le format.

L'idée ça serait évidemment qu'à l'insertion de ces caractères dans la table ils se mettent en auto au bon format.

Alors pour le moemnt j'ai développé ça :

CREATE OR REPLACE FUNCTION update_char2date() 

RETURNS "trigger" AS $date$
    BEGIN
		
		NEW.date_referentiel=to_timestamp(NEW.date_referentiel,'DD/MM/YYYY');
		NEW.date_acquisition=to_timestamp(NEW.date_acquisition,'DD/MM/YYYY');
		
		RETURN NEW;
		
    END;

$date$

LANGUAGE 'plpgsql';
ALTER FUNCTION update_char2date() OWNER TO postgres;

CREATE TRIGGER update_char2date BEFORE INSERT OR UPDATE
ON table FOR EACH ROW
EXECUTE PROCEDURE update_char2date();

Mais ça ne fonctionne pas...pourtant l'enthousiasme y était...

auriez-vous une idée pour me dépatouiller de cette problématique, ou bien il est impossible d'insérer du caractère dans une colonne définit en timestamp, donc le problème doit se résoudre en amont?!

Merci d'avance.

#179 Re : PL/pgSQL » Concaténation de champ automatique avec conditions » 12/08/2011 12:06:15

En effet l'update qui tourne en boucle, ça me parait beaucoup plus clair maintenant, et ça me parait tellement évident. Ca veut donc dire qu'on ne peut pas faire d'update à partir d'un trigger, si j'ai bien compris...

Par rapport au code, je ne savait pas qu'en intégrant un SELECT INTO dans un trigger, il ne crée pas en 'dur' la table dans la BDD.

J'ai réussi à adapter la requête que vous m'avez donné et je vous remercie vivement pour l'aide que vous m'avez apporté.

Bonne continuation et peut être à bientôt. ;-)

#180 Re : PL/pgSQL » Concaténation de champ automatique avec conditions » 11/08/2011 13:38:21

Bonjour gleu,

En fait j'aurais aimé savoir si les conditions dans une fonction qui renvoi un trigger, s'écrit de manière général de la façon dont je l'ai écrite sur mon précédent post

Je pose cette question, sachant que le trigger ne fonctionne pas correctement (j'ai l'impression qu'avec ce trigger l'update tourne en boucle dans le vide et la base plante).

Dans le même style j'ai testé de créer un trigger avec le code suivant :

Avec deux bases, une base 'commune' qui contient un code associé à une commune et une base sur laquelle je fais ma requête.

Le but étant de mettre à jour automatiquement dans ma BDD ou je fais la requête le nom de la commune en fonction du code qu'il va chercher dans la table 'commune' (Je suis clair?), ma requête qui fonctionne donne ça :

CREATE OR REPLACE FUNCTION update_e()
  RETURNS "trigger" AS $BODY$
 
    BEGIN
 
	UPDATE e
	SET e.nom=foo.nom 
	FROM dblink('hostaddr=127.0.0.1 port=5400 dbname=bidule user=postgres password=machin', 'SELECT code, nom FROM commune') AS foo (code integer, nom varchar)
	WHERE e.code_insee=foo.code

 
    END;
$BODY$

LANGUAGE 'plpgsql';
 
ALTER FUNCTION update_e()OWNER TO postgres;
 
CREATE TRIGGER update_eBEFORE INSERT OR UPDATE
ON eFOR EACH ROW
EXECUTE PROCEDURE update_e();

Mais quand il s'agit de la faire fonctionner on dirait que ça tourne en boucle sans s'arrêter et ça plante...

Merci de m'éclairer un peu, pour savoir si je fais un truc mal ou si j'oublie quelque chose...

Bonne journée.

Xavier

#181 PL/pgSQL » Concaténation de champ automatique avec conditions » 10/08/2011 10:44:58

Geo-x
Réponses : 5

Bonjour à tous,

Voici l'idée générale de ma requête. Je souhaiterais pouvoir remplir automatiquement un champ par concaténation via un trigger.

Ce trigger appel une fonction qui met des conditions à cette mise à jour.

Voici l'idée :

CREATE OR REPLACE FUNCTION UPDATE()
  RETURNS "trigger" AS $nomfic$
 
    BEGIN
 
	IF code_insee IS NULL THEN
 
	NEW.nomfic:='';
 
	ELSIF nom IS NULL
 
	NEW.nomfic:='';
 
	ELSIF nom AND code_insee IS NOT NULL THEN
 
	NEW.nomfic:=NEW.code_insee||'-'||NEW.nom||'machin';
 
	END IF;
        RETURN NEW;
 
    END;
$nomfic$
  LANGUAGE 'plpgsql';
 
ALTER FUNCTION UPDATE()OWNER TO postgres;
 
CREATE TRIGGER UPDATE BEFORE INSERT OR UPDATE
ON MaTable FOR EACH ROW
EXECUTE PROCEDURE UPDATE();

En espérant que vous puissiez m'éclairer sur les conditions dans une fonction...

Merci d'avance.

Geo-x

Pied de page des forums

Propulsé par FluxBB