Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Outils PostgreSQL Discussion :

Passage de paramètre psql


Sujet :

Outils PostgreSQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    octobre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 30
    Points : 34
    Points
    34
    Par défaut Passage de paramètre psql
    Bonjour,

    Bien qu'il y a ait déjà des posts sur ce sujet, je ne trouve pas ma réponse dans ce qui est proposé.

    Je suis sur Linux. j'ai donc un script shell qui à un moment donné appelle un script sql. A l'origine la base de données cible étant ORACLE, j'avais sqlplus.
    Maintenant, avec postgres, j'utilise donc psql. Voilà pour l'antériorité

    Donc, le contenu du fichier alertes_gsa.sql contenant le SQL est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  PCMS_CHDOC_DATA.PRODUCT_ID||':'||PCMS_CHDOC_DATA.CH_DOC_ID||':'||PCMS_CHDOC_DATA.ACTION_DATE||':'||PCMS_CHDOC_DATA.NUMERO_LHENA
    FROM    PROD.PCMS_CHDOC_DATA PCMS_CHDOC_DATA
    WHERE   ((PCMS_CHDOC_DATA.STATUS='PRE-PROD') OR (PCMS_CHDOC_DATA.STATUS='REC_PROD'))
    AND     (PCMS_CHDOC_DATA.CH_DOC_TYPE='DM')
    AND     (PCMS_CHDOC_DATA.ACTION_DATE < to_date(':date1', 'yyyy-mm-dd HH24:MI,SS'))
    ORDER BY PCMS_CHDOC_DATA.PRODUCT_ID, PCMS_CHDOC_DATA.CH_DOC_ID ;
    Maintenant, lorsque je lance l'ordre SQL suivant, ça plante :
    psql: FATAL: database "00:00:00'" does not exist
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     psql -U prod -f /dimdata/surveillance/scripts/alertes/alertes_gsa.sql --set date1=\'2019-01-01 00:00:00\'
    Pourtant, si je remplace date1 par sa valeur dans le sql, j'ai bien ce que je veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  PCMS_CHDOC_DATA.PRODUCT_ID||':'||PCMS_CHDOC_DATA.CH_DOC_ID||':'||PCMS_CHDOC_DATA.ACTION_DATE||':'||PCMS_CHDOC_DATA.NUMERO_LHENA
    FROM    PROD.PCMS_CHDOC_DATA PCMS_CHDOC_DATA
    WHERE   ((PCMS_CHDOC_DATA.STATUS='PRE-PROD') OR (PCMS_CHDOC_DATA.STATUS='REC_PROD'))
    AND     (PCMS_CHDOC_DATA.CH_DOC_TYPE='DM')
    AND     (PCMS_CHDOC_DATA.ACTION_DATE < to_date('2019-01-01 00:00:00', 'yyyy-mm-dd HH24:MI,SS'))
    ORDER BY PCMS_CHDOC_DATA.PRODUCT_ID, PCMS_CHDOC_DATA.CH_DOC_ID ;
    psql -U prod -f /dimdata/surveillance/scripts/alertes/alertes_gsa.sql

    résultat OK
    ?column?
    --------------------------------------------------------------
    ADTNETOPDV:ADTNETOPDV_DM_1:2015-11-23 09:45:30:201410CH625
    ALTA:ALTA_DM_223:2017-12-15 15:12:33:CHG0043521
    ALTAIX:ALTAIX_DM_15:2016-09-02 17:22:39:chg0036399
    J'ai essayé pas mal de choses qui ont été dites dans les différents posts, mais ça ne marche pas chez moi. Est-ce qu'il y auraient des paramètres spéciaux à positionner (genre fichier .conf) ?
    Merci pour vos réponses

  2. #2
    Membre expérimenté Avatar de vttman
    Homme Profil pro
    Mainframe et le WE (SQL et CSS)
    Inscrit en
    décembre 2002
    Messages
    848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Mainframe et le WE (SQL et CSS)
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2002
    Messages : 848
    Points : 1 620
    Points
    1 620
    Par défaut
    Bonjour,
    J'aurais tenté un :date1 sans '' ...

    SELECT PCMS_CHDOC_DATA.PRODUCT_ID||':'||PCMS_CHDOC_DATA.CH_DOC_ID||':'||PCMS_CHDOC_DATA.ACTION_DATE||':'||PCMS_CHDOC_DATA.NUMERO_LHENA
    FROM PROD.PCMS_CHDOC_DATA PCMS_CHDOC_DATA
    WHERE ((PCMS_CHDOC_DATA.STATUS='PRE-PROD') OR (PCMS_CHDOC_DATA.STATUS='REC_PROD'))
    AND (PCMS_CHDOC_DATA.CH_DOC_TYPE='DM')
    AND (PCMS_CHDOC_DATA.ACTION_DATE < to_date(:date1, 'yyyy-mm-dd HH24:MI,SS'))
    ORDER BY PCMS_CHDOC_DATA.PRODUCT_ID, PCMS_CHDOC_DATA.CH_DOC_ID ;
    Laurent
    Il ne pleut jamais en Moselle !

  3. #3
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    4 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 4 902
    Points : 13 813
    Points
    13 813
    Billets dans le blog
    1
    Par défaut
    Supprimez effectivement les quotes : une host variable n'est pas une chaîne de caractères

    Profitez-en pour supprimer également les parenthèses inutiles et pour remplacer les noms de table "in extenso" par des alias plus pratiques, la requête sera plus lisible
    (d'ailleurs à quoi bon utiliser des alias si c'est pour reprendre exactement le nom de la table )

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  PCD.PRODUCT_ID||':'
          ||PCD.CH_DOC_ID||':'
          ||PCD.ACTION_DATE||':'
          ||PCD.NUMERO_LHENA
    FROM  PROD.PCMS_CHDOC_DATA PCD
    WHERE (PCD.STATUS='PRE-PROD' OR PCD.STATUS='REC_PROD')
      AND PCD.CH_DOC_TYPE='DM'
      AND PCD.ACTION_DATE < to_date(:date1, 'yyyy-mm-dd HH24:MI,SS')
    ORDER BY PCD.PRODUCT_ID
        , PCD.CH_DOC_ID 
    ;
    Et une remarque "PRE-PROD" avec un tiret, mais "REC_PROD" avec un tiret inférieur, est-ce normal ?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    octobre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 30
    Points : 34
    Points
    34
    Par défaut Résolu
    Bonjour et Merci pour vos conseils.

    En fait, il manquait 2 choses : une dans l'ordre SQL, où, hors de la mise en page, effectivement, il ne fallait pas mettre de quotes autour de la host variable
    et l'autre dans les paramètres de la commande psql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    --set date1=\'2019-01-01 00:00:00\'
    où il fallait mettre un \ pour protéger l'espace (le champ comporte un caractère espace entre la date et l'heure)
    en fait, il fallait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    --set date1=\'2019-01-01\ 00:00:00\'
    pour que ça marche.

    Ça, c'est en ligne de commande, et si je l'intègre dans un script shell, il faut que je mette des quotes et des doubles quotes autour de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DTE='2019-01-01 00:00:00'
    psql -U prod -f /dimdata/surveillance/scripts/alertes/alertes_gsa2.sql --set date1="'$DTE'"
    (j'ai mis les détails au cas où quelqu'un aurait eu les mêmes problèmes)

    Merci à tous en tous cas.
    Sinon, pour répondre à la remarque de Escartefigue, oui, c'est normal, le libellé de la colonne a été créé comme ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. passage de paramètres psql
    Par Rocou dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 11/10/2007, 12h37
  2. probleme lors du passage de paramètre
    Par maxmj dans le forum ASP
    Réponses: 4
    Dernier message: 18/11/2003, 00h15
  3. [XSL] Passage de paramètres à un template
    Par pantin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/06/2003, 13h28
  4. passage de paramètres
    Par pram dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/02/2003, 17h28
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo