Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
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 19/09/2011, 15h14   #1
Invité de passage
 
Inscription : mai 2010
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 21
Points : 2
Points : 2
Par défaut Récupération d'une variable dans un update

Bonjour,

je voudrais créer un fichier texte pour chacune de mes dates pour cela j'ai le trigger suivant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-- Create function
 
CREATE OR REPLACE FUNCTION export_text () RETURNS TRIGGER AS
--Declaration d'une variable locale
$BODY$
  DECLARE
    str_date varchar(20);
  BEGIN 
-- on met dans la variable locale le max de la colonne   
    str_date:=TG_ARGV[1];
    copy (SELECT * FROM fr_30y WHERE tmp = to_char(str_date) ) TO 'C:/o/d_''str_date''.txt';
    NEW.valid:=1;
    RETURN NEW;
  END; 
$BODY$
LANGUAGE 'plpgsql'; 
 
--Creation du trigger
DROP TRIGGER trig_txt_date ON all_date;
CREATE TRIGGER trig_txt_date AFTER INSERT ON all_date
FOR EACH ROW 
EXECUTE PROCEDURE export_text();
--*/
 
INSERT INTO all_date(string_date,date_)
	VALUES('20120927', to_date('20120927','YYYYMMDD'));
Cependant je n'arrive pas à récupérer la valeur de ma variable str_date, je voudrais la mettre dans ma clause where ainsi que dans le nom du fichier.txt

Je n'arrive évidement pas à récupérer cette valeur...

Si quelqu'un a une idée je suis preneur !

merci d'avance!
benbannock est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 17h08   #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
TG_ARGV fait référence à des arguments d'une commande CREATE TRIGGER qui n'est pas montrée dans le message, donc impossible de voir une éventuelle erreur.

Mais ce qui parait étonnant ici c'est d'utiliser un trigger au lieu d'une fonction normale qui prendrait des paramètres normalement.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 18h46   #3
Invité de passage
 
Inscription : mai 2010
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 21
Points : 2
Points : 2
Effectivement, il aurait peut-être fallu utiliser une procédure normale je ne l'ai pas vu car je débute avec Postgres.

L'intérêt que j'ai trouvé au trigger était le "FOR EACH ROW" mais peut-être est-il accessible d'une autre manière que via un trigger.

Finalement j'ai réussi à faire ce que je désirais avec le code suivant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
-- Create function
CREATE OR REPLACE FUNCTION export_text () RETURNS TRIGGER AS
$BODY$
  DECLARE
    str_date varchar(20);
    path varchar(200);
    command varchar(1000);
  BEGIN  
    str_date:=NEW.string_date;
    path:='''C:/o/d_'||NEW.string_date||'.txt''';
    command:= 'copy (select station,
			x_long, 
			y_lat, 
			...
			id_thunder, 
			id_tornado from fr_30y where tmp = '''||str_date||''' ) to '||path||';';
    execute command;
    RETURN NEW;
  END; 
$BODY$
LANGUAGE 'plpgsql'; 
 
--Creation du trigger
DROP TRIGGER trig_txt_date ON all_date;
CREATE TRIGGER trig_txt_date AFTER INSERT ON all_date
FOR EACH ROW 
EXECUTE PROCEDURE export_text();
--*/
 
--delete from all_date;
--Insert into all_date (string_date,date_)
--	values('19790104',to_date('19790104','YYYYMMDD')),
--	('19790110',to_date('19790110','YYYYMMDD'));
--	select distinct(tmp),date_ from fr_30y;
 
INSERT INTO all_date (string_date)
	VALUES('20031225'),
('19881008'),
('20070819'),
...
...
('20100215');
Si quelqu'un a une idée d'amélioration, ça m'intéresse également!

Et une dernière chose : que je ne comprends pas pourquoi mon champ "valid" n'est pas mis à jour avec
benbannock est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2011, 19h25   #4
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
Pour modifier une valeur de la ligne, logiquement il faudrait un trigger BEFORE INSERT au lieu de AFTER INSERT.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/09/2011, 18h27   #5
Invité de passage
 
Inscription : mai 2010
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 21
Points : 2
Points : 2
Effectivement ça m'a l'air plutôt logique ... Je vais essayer ça!
benbannock 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 03h19.


 
 
 
 
Partenaires

Hébergement Web