IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Langage SQL Discussion :

[Oracle] - Requête avec paramètres


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut [Oracle] - Requête avec paramètres
    Bonjour,

    J'aimerais passer trois paramètres dans une requête oracle : l'un pour récupérer le jour, l'autre le mois et le dernier, l'année.

    Voici ma syntaxe :

    SELECT
    OPRID,
    QRYNAME,
    COUNT(QRYNAME) AS "c1",
    TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'YYYY')) AS "c2",
    TO_CHAR(DATETIME_ADDED, 'MONTH') AS "c3",
    TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'DD')) AS "c5"

    FROM
    PS_MI_TBL T1

    WHERE
    (DATETIME_ADDED >= TO_DATE('2004-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
    AND
    (TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'YYYY'))
    = TO_NUMBER(': annee'))

    AND
    (TO_CHAR(DATETIME_ADDED, 'MONTH') = ': mois')
    AND
    (TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'DD'))
    = TO_NUMBER(': jour'))

    GROUP BY
    TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'DD')),
    TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'YYYY')),
    TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'MM')),
    TO_CHAR(DATETIME_ADDED, 'MONTH'),
    OPRID,
    QRYNAME

    ORDER BY "c2", "c3", "c5"

    L'erreur annoncée est une erreur ORA 01722, soit un invalid number.

    Est-ce que quelqu'un pourrait m'aider à débugger cette query ?!

    Merci à tous.

    BOOtny

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Sans jeu d'essais, ça me paraît difficile...

    L'erreur intervient-elle systématiquement ?
    Si non, avec quelles paramètres ?

    Pourquoi tu fais des comparaisons comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'YYYY')) = TO_NUMBER(': annee')) 
    Sans les TO_NUMBER, ça ne fonctionnerait pas aussi bien ? Comme tu l'as fait pour le mois d'ailleurs.

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    j'essaie progressivement :

    WHERE
    (DATETIME_ADDED >= TO_DATE('2004-04-01 00:00:00','YYYY-MM-DD HH24:MI:SS'))
    AND
    (TO_NUMBER(TO_CHAR(DATETIME_ADDED,'YYYY'))= TO_NUMBER('2005'))
    -- AND

    -- (TO_CHAR(DATETIME_ADDED,'MONTH')= TO_CHAR("MAI"))
    AND
    (TO_NUMBER(TO_CHAR(DATETIME_ADDED,'DD'))= TO_NUMBER('2'))


    Avec cette écriture, la query me ressort une liste convenable. Les TO_NUMBER passent dans ce cas de test. Par contre, le mois ne passe pas pour sa part, ni avec un TO_CHAR("..."), un TO_CHAR('..'), un '...' ni un "..." .

    Je cherche dans le formatage des chaînes de caractères. Mais si quelqu'un a une idée, je suis preneuse.

    Merci encore !

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    C'est bon, j'ai trouvé la solution. L'astuce : la fonction TRIM pour obtenir des chaines de caractères de bonne longueur.

    SELECT
    COUNT(QRYNAME) AS "c1",
    TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'YYYY')) AS "c2",
    TRIM(TO_CHAR(DATETIME_ADDED, 'MONTH')) AS "c3",
    TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'MM')) AS "c4",
    TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'DD')) AS "c5"

    FROM
    PS_N_MIQRY_TBL T1

    WHERE
    (DATETIME_ADDED >= TO_DATE('2004-04-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
    AND
    (TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'YYYY')) = TO_NUMBER(:annee))
    AND
    (TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'DD')) = TO_NUMBER(:jour)) AND
    (TRIM(TO_CHAR(DATETIME_ADDED, 'MONTH')) = TO_CHAR(:mois))

    GROUP BY
    TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'DD')),
    TO_NUMBER(TO_CHAR(DATETIME_ADDED, 'YYYY')),
    TO_CHAR(DATETIME_ADDED, 'MONTH'),
    OPRID,
    QRYNAME

    ORDER BY "c2", "c3", "c5"

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Ceci étant spécifique à Oracle, merci de poster dans le forum ORACLE !

    A +

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

Discussions similaires

  1. Requête avec paramètres variables
    Par dahu17 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/05/2007, 11h38
  2. [Requête][03]Problème d'export d'une requête avec paramètre
    Par SLE dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 02/04/2007, 12h29
  3. Réponses: 5
    Dernier message: 06/01/2007, 05h48
  4. test d'une requête avec paramètre
    Par hervé14670 dans le forum Access
    Réponses: 1
    Dernier message: 12/01/2006, 23h45
  5. [Oracle] Requête avec colonne optionnelle
    Par Original Prankster dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/08/2005, 10h24

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