Vous n'êtes pas identifié(e).
Pages : 1
J'ai enfin trouvé la solution à mon problème,
voici le script :
DECLARE
ordre_sql VARCHAR(1000);
num_id INTEGER := 1;
compteur INTEGER;
num_interv varchar(50); ------->ajouter nouvelle variable
BEGIN
EXECUTE ' SELECT COUNT (*) FROM nom_table 'INTO compteur;
WHILE (compteur <> 0)LOOP
--------nouvelle ligne ------------------
EXECUTE ' SELECT colonne1 FROM nom_table WHERE numero = '||num_id||' LIMIT 1 'into num_interv;
------------------------------------------
ordre_sql :='COPY (SELECT * FROM nom_table WHERE numero = num_id LIMIT 1)
TO D:/EasyPHP-5.3.8.1/tmp/RI_AXI_0_'||num_interv||'.txt''DELIMITER '';''';
num_id = num_id + 1;
compteur = compteur - 1;
EXECUTE ordre_sql;
END LOOP;
END;
END;
Comment faire pour mettre "résolu" à cette discussion ?
Bonjour,
merci pour ta réponse dverite, maintenant j'arrive à récupérer chaque ligne de la table qui correspond à un fichier texte.
Il me reste un point sur lequel je bloque et c'est l'intitulé de cette discussion :
récupérer la valeur d'un champ pour la concaténer dans le nom du fichier texte c'est à dire,
j'ai une table nom_table
numero | colonne1 | colonne2 | colonne3
------------------------------------------------------------------------------------------------------------
1 0-123 dupont marc
2 0-555 martin pierre
3 0-987 françois damien
et dans le script je veux faire ceci:
TO D:/EasyPHP-5.3.8.1/tmp/RI_AXI_0_'||colonne1||'.txt';
ce qui donnerai dans mon dossier tmp:
RI_AXI_0_0-123.txt
RI_AXI_0_0-555.txt
RI_AXI_0_0-987.txt
Comment définir la variable qui correspond à cette colonne1 ?
Merci d'avance.
J'ai remarqué que j'avais oublié d'executer la variable "ordre_sql"
DECLARE
ordre_sql VARCHAR(1000);
num_id INTEGER := 1;
compteur INTEGER;
BEGIN
EXECUTE ' SELECT COUNT (*) FROM rapport_curatif 'INTO compteur;
WHILE (compteur <> 0)LOOP
ordre_sql :='COPY (SELECT * FROM nom_table WHERE numero = num_id LIMIT 1)
TO D:/EasyPHP-5.3.8.1/tmp/RI_AXI_0_'||colonne1||'.txt';
num_id = num_id + 1;
compteur = compteur - 1;
=======>>>EXECUTE ordre_sql;
END LOOP;
END;
ET j'ai ce nouveau message d'erreur :
ERREUR: la colonne « num_id » n'existe pas
LINE 1: ...* FROM rapport_curatif WHERE numero = num_id LIM...
^
QUERY: COPY (SELECT * FROM rapport_curatif WHERE numero = num_id LIMIT 1)
TO 'D:/EasyPHP-5.3.8.1/tmp/RI_AXI_0_1.txt'
CONTEXT: PL/pgSQL function "test1" line 116 at instruction EXECUTE
J'ai remanié le script :
create or replace function test1() returns text as $$
DECLARE
resultat text;
BEGIN
DROP TABLE IF EXISTS nom_table;
CREATE TABLE nom_table(
numero serial NOT NULL,
colonne1 character varying(56),
colonne2 character varying(20),
colonne3 integer;
CONSTRAINT pk_nom_table PRIMARY KEY (numero)
)WITHOUT OIDS;
INSERT INTO nom_table (colonne1,colonne2,colonne3)
SELECT a.champ1,a.champ2,e.champ3
FROM autre_table a
INNER JOIN encore_table e ON e.id = a.id;
DECLARE
ordre_sql VARCHAR(1000);
num_id INTEGER := 1;
compteur INTEGER;
BEGIN
EXECUTE ' SELECT COUNT (*) FROM rapport_curatif 'INTO compteur;
WHILE (compteur <> 0)LOOP
ordre_sql :='COPY (SELECT * FROM nom_table WHERE numero = num_id LIMIT 1)
TO D:/EasyPHP-5.3.8.1/tmp/RI_AXI_0_'||colonne1||'.txt';
num_id = num_id + 1;
compteur = compteur - 1;
END LOOP;
END;
RETURN resultat;
END;
$$ language plpgsql;
@Flo, non ce n'est ni "numero" et ni "num_id" que je veux concaténer dans le nom du fichier texte mais la valeur qui se trouve dans la "colonne1", est ce que je dois la déclarer de cette manière :
=======> ma_colonne1 ma_table.colonne1%TYPE ou bien c'est autre chose ?.
@Martin, j'ai renommé autrement les tables pour éviter la confusion.
Voici le script dans son intégralité :
create or replace function test1() returns text as $$
BEGIN
DROP TABLE IF EXISTS nom_table;
CREATE TABLE nom_table(
numero serial NOT NULL,
colonne1 character varying(56),
colonne2 character varying(20),
CONSTRAINT pk_nom_table PRIMARY KEY (numero)
)WITHOUT OIDS;
INSERT INTO nom_table ( numero,
colonne1,
colonne2)
SELECT
champ1,
champ2,
champ3
FROM table;
DECLARE
ordre_sql VARCHAR(1000);
num_id INTEGER :=1;
compteur INTEGER;
BEGIN
EXECUTE ' SELECT COUNT (*) FROM nom_table ' INTO compteur;
WHILE (compteur <> 0)LOOP
ordre_sql :='COPY (SELECT * FROM nom_table WHERE numero = num_id LIMIT 1)
TO D:/EasyPHP-5.3.8.1/tmp/RI_AXI_0_'||numero||'.txt';
num_id = num_id + 1;
compteur = compteur - 1;
id_texte = id_texte + 1;
END LOOP;
END;
RETURN 1;
END;
$$ language plpgsql;
Bonjour,
désolé j'ai tout simplement abrégé le début du script, j'ai bien un nom et un type et également le ";" à la fin du SELECT.
A partir du bloc DECLARE, le script est dans son intégralité.
Bonjour,
j'ai créé une fonction qui met en place la création d'une table dans le but de récupérer plusieurs champs de différentes tables de la même base de donnée.
Puis je dois récupérer les valeurs de ces champs pour les exporter dans un fichier texte MAIS chaque fichier texte correspond à une ligne de la table crée et je dois récupérer la valeur d'un champ pour le concaténer dans le nom de ce fichier texte.
Voici le script concernant exportation dans le fichier texte :
CREATE FUNCTION nom_fonction returns text as $$
BEGIN
DROP TABLE IF EXISTS nom_table;
CREATE TABLE nom_table (numero, colonne1, colonne2);
INSERT INTO nom_table(numero, colonne1, colonne2)
SELECT champ1, champ2, champ3 from table
DECLARE
ordre_sql VARCHAR(1000);
num_id INTEGER :=1;
compteur INTEGER;
BEGIN
EXECUTE ' SELECT COUNT (numero) FROM nom_table 'INTO compteur;
WHILE (compteur <> 0)LOOP
ordre_sql :='COPY (SELECT * FROM nom_table WHERE numero = num_id LIMIT 1)
TO D:/EasyPHP-5.3.8.1/tmp/RI_AXI_0_'||id_rapport_curatif||'.txt';
num_id = num_id + 1;
compteur = compteur - 1;
END LOOP;
END;
RETURN 1;
END;
$$ language plpgsql;
Je précise que la création de la table et l'insertion des données se fait correctement mais j'ai ce message d'erreur qui s'affiche :
PL/pgSQL function "test1" line 10 at instruction SQL
ERREUR: la colonne «numero » n'existe pas
LINE 2: TO D:/EasyPHP-5.3.8.1/tmp/RI_AXI_0_'||id_rapport_cur...
^
QUERY: SELECT 'COPY (SELECT * FROM nom_table WHERE numero = num_id LIMIT 1)
TO D:/EasyPHP-5.3.8.1/tmp/RI_AXI_0_'||numero||'.txt'
CONTEXT: PL/pgSQL function "test1" line 111 at affectation
Merci d'avance pour vos suggestions.
Merci pour vos réponses et bonne continuation.
Bonjour,
après plusieurs manipulations sans succès, j'ai désinstallé postgreSQL puis je l'ai installé à nouveau et à ma grande surprise j'ai pu démarrer à nouveau ce service.
Du coup j'ai exécuté la tâche planifié mise en place et toujours rien, je vais vérifier dans le catalogue pgAgent de la base de donnée sur laquelle je travaille et je constate que les tables correspondants aux job, steps et shedules sont vides ??????
Suite à d'autres manipulations, je décide d'utiliser la base de donnée par défaut (postgres), je récupère les tables de mon autre base de donnée et je définis au niveau du "pas" (step) dans l'onglet "propriétés" la base de donnée : "postgres" et là je constate de un que les différents éléments de la tâche sont bien insérés dans les tables du catalogue pgAgent et de deux que celle-ci s'exécute bien en fonction des paramètres choisis.
Du coup je suis ravi que ça fonctionne mais j'ai quand même une dernière question, doit-on obligatoirement passer par la base de donnée par défaut "postgres" pour pouvoir planifier des tâches (jobs).
Merci d'avance.
Suite à la modification du mot de passe, je n'ai plus le message suivant :
Couldn't create connection: fe_sendauth: no password supplied (onglet "Evènement").
Je n'ai que des informations concernant pgagent dans l'observateur d'évènements.
Par rapport à cette modification, je n'arrive plus à démarrer postrgesql.
1er cas : propriétés>onglet connexion> cocher compte système local, j'ai la boîte de dialogue suivante :
Postgresql a démarré puis c'est arrêté...........
2nd cas : propriétés>onglet connexion> cocher ce compte, j'ai la boîte de dialogue suivante :
erreur 1069 : l'échec d'une ouverture de session a empêché le démarrage du service.
Je ne peux pas le ressaisir parce que je ne le connais, y a t-il une démarche qui permettrai d'avoir connaissance de ce celui-ci.
Par contre dans l'observateur d'évènements la description de l'onglet "Evènement" affiche :
Couldn't create connection: fe_sendauth: no password supplied (apparemment il manque le mot de passe)
Comment faire si c'est le cas de définir un mot de passe ?
Bonjour,
en effet le compte de connexion est déjà celui-ci ".\posgtres" et j'ai toujours le même message d'erreur.
Je tiens à préciser au cas où que je ne travail pas avec la base de donnée "postgres".
Ce service était désactivé mais en cliquant sur "démarrer" une boîte de dialogue s'affiche dont le contenu est le suivant :
Impossible de démarrer le service PostgreSQL Sheduling Agent - PgAgent sur ordinateur local
Erreur 1069 : l'échec d'une ouverture de session a empêché le démarrage du service.
Bonjour,
Avant de rentrer dans les détails, je précise que je suis débutant.
Je travail sous windows xp, postgreSQL 8.4 et pgAdmin III 1.10 et enfin je travail en local.
J'ai installé pgAgent (j'ai suivi la notice d'installation de celui-ci fourni avec pgAdmin).
Le noeud "job" (tâche) est apparu dans l'arborescence, j'ai donc ensuite créé un "shedule" (planification) puis un "step" (étape).
Le but de cette tâche planifié est d'exécuter une procédure stockée qui récupère certaines données d'une table puis de les exporter vers un fichier plat (cette procédure fonctionne quand je l'exécute dans l'éditeur de requête).
Mon problème est le suivant : une fois c'est trois élément paramétré, le "job" ne s'exécute pas à l'heure souhaité.
Merci d'avance pour vos suggestions.
Pages : 1