PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 Re : Général » mettre valeur colonne dans le nommage d'un fichier.txt » 20/01/2012 11:54:42

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 ?

#2 Re : Général » mettre valeur colonne dans le nommage d'un fichier.txt » 20/01/2012 10:41:01

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.

#3 Re : Général » mettre valeur colonne dans le nommage d'un fichier.txt » 19/01/2012 18:28:52

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

#4 Re : Général » mettre valeur colonne dans le nommage d'un fichier.txt » 19/01/2012 17:28:50

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.

#5 Re : Général » mettre valeur colonne dans le nommage d'un fichier.txt » 19/01/2012 15:09:30

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;

#6 Re : Général » mettre valeur colonne dans le nommage d'un fichier.txt » 19/01/2012 12:56:20

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é.

#7 Général » mettre valeur colonne dans le nommage d'un fichier.txt » 19/01/2012 12:37:50

delirium
Réponses : 14

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.

#9 Re : Installation » tâche planifié (pgAgent) ne s'exécute pas. » 13/01/2012 10:44:34

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.

#10 Re : Installation » tâche planifié (pgAgent) ne s'exécute pas. » 12/01/2012 11:56:04

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.

#11 Re : Installation » tâche planifié (pgAgent) ne s'exécute pas. » 11/01/2012 16:29:00

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 ?

#12 Re : Installation » tâche planifié (pgAgent) ne s'exécute pas. » 11/01/2012 15:10:07

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".

#13 Re : Installation » tâche planifié (pgAgent) ne s'exécute pas. » 11/01/2012 14:53:37

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.

#14 Installation » tâche planifié (pgAgent) ne s'exécute pas. » 11/01/2012 10:32:56

delirium
Réponses : 12

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.

Pied de page des forums

Propulsé par FluxBB