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

  1. ###raw>post.musername###
    Nouveau membre du Club
    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
      0  0

  2. #2
    Membre chevronné
    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
    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. ###raw>post.musername###
    Nouveau membre du Club
    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.
      1  0

###raw>template_hook.ano_emploi###