Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/12/2011, 15h24   #1
Invité régulier
 
Tovo RAKOTOZANANY
Administrateur systèmes et réseaux
Inscription : février 2008
Messages : 46
Détails du profil
Informations personnelles :
Nom : Tovo RAKOTOZANANY
Localisation : Madagascar

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2008
Messages : 46
Points : 8
Points : 8
Par défaut Encore le trigger sur dblink_exe

Bonjour,

J'utilse postgres 9.0 sous windows sur mon local et un autre postgres 8.4 sur un serveur linux .

J'ai mis deux base de donnée identique sur les deux serveurs nommée suiviBP avec la table eth0

Code :
1
2
3
4
5
6
7
8
CREATE TABLE eth0
(
  rx character varying(256),
  tx character varying(256),
  datecurrent date,
  heurecurrent time without time zone NOT NULL,
  CONSTRAINT eth0_pkey PRIMARY KEY (heurecurrent)
)
Le but de mon projet est de pouvoir récupéré chaque ligne insérer dans la table eth0 de ma base local vers la table eth0 de la base sous linux .

Pour ce faire donc , j'ai crée un fonction f_insert_eth0

Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION f_insert_eth0()
  RETURNS TRIGGER AS
$BODY$
  DECLARE    	
  BEGIN                           
    PERFORM dblink_exec('host=10.128.1.2 dbname=suiviBP user=postgres port=5432 password=postgres', 'INSERT INTO eth0 (rx,tx,datecurrent,heurecurrent) VALUES (' || NEW.rx || ',' || NEW.tx || ',' || NEW.datecurrent || ',' || NEW.heurecurrent || ')');                                 
    RETURN NEW;
  END; 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION f_insert_eth0() OWNER TO postgres;

qui sera appelé par une trigger

Code :
1
2
3
4
5
CREATE TRIGGER trg_insert_eth0
  AFTER INSERT
  ON eth0
  FOR EACH ROW
  EXECUTE PROCEDURE f_insert_eth0();
Je ne pense pas qu'il y a des érreurs sur mes codes mais quand je lance un insertion quelconque

Code :
INSERT INTO eth0 VALUES ('69486586','64366',current_date,current_time);

J'ai le message d'érreur suivante
Code :
1
2
3
4
ERREUR:  erreur de syntaxe sur ou près de « : »
CONTEXT:  Error occurred ON dblink connection named "unnamed": could NOT execute command.
instruction SQL « SELECT dblink_exec('host=10.128.1.2 dbname=suiviBP user=postgres port=5432 password=postgres', 'INSERT INTO eth0 (rx,tx,datecurrent,heurecurrent) VALUES (' || NEW.rx || ',' || NEW.tx || ',' || NEW.datecurrent || ',' || NEW.heurecurrent || ')') »
PL/pgSQL FUNCTION "f_insert_eth0" line 7 at PERFORM
la connexion dblink_exec marche correctement.

et en effet quand dans ma fonction je n'ajoute que la valeur des rx et tx dans l'autre base cela fonctionne bien

Code :
PERFORM dblink_exec('host=10.128.1.2 dbname=suiviBP user=postgres port=5432 password=postgres', 'INSERT INTO eth0 (rx,tx) VALUES (' || NEW.rx || ',' || NEW.tx || ')');

C'est le fait que j'ajoute
Code :
NEW.datecurrent || ',' || NEW.heurecurrent
qui pose problème ?

Est ce que dans un trigger pour ajouter la valeur de la colonne datecurrent et heurecurrent nouvellement inseré je ne doit pas faire appelle à

Code :
NEW.datecurrent || ',' || NEW.heurecurrent
Quelle est la cause ? des idées ?
fanah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 17h15   #2
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
Le problème est qu'avec ton code actuel la clause VALUES va être du style:
Code :
VALUES (10, 20, 2011-12-02,17:04:32.559789)
Et ça c'est syntaxiquement invalide. Pour les colonnes de type numérique c'est bon mais pour les dates et heures, il faut passer par des chaines de caractère pour les intégrer au texte de la requête, c.a.d quelque plutôt du genre:
Code :
VALUES (10, 20, cast ('2011-12-02' AS date), cast('17:04:32.559789' AS time without time zone))
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h14.


 
 
 
 
Partenaires

Hébergement Web