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

SQL Oracle Discussion :

Requête qui accepte 1 TO_CHAR sur 2


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 36
    Par défaut Requête qui accepte 1 TO_CHAR sur 2
    Bonjour à tous,

    J'ai quelques soucis concernant une requête avec des dates. J'ai parcouru le forum et je n'ai rien trouvé alors je m'aventure à vous exposer mon problème !

    Voici ma requête de départ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    SELECT DISTINCT 
    	MACHINES.MA_NAME,
    	RQ_EXAMS.RQEX_DONE AS DATERDV,
    	PATIENTS.P_NATNUMBER,
    	PATIENTS.P_NAME AS PAT_NOM,
    	PATIENTS.P_FNAME AS PAT_PREN,
    	PATIENTS.P_PARTNER AS PATMAR_NOM,
    	PATIENTS.P_BORN AS PAT_NAIDATE,
    	PATIENTS.P_SEX AS PAT_SEXE,
    	EXAMS.EX_NAME,
    	QPQD_LINK.QPQD_ACCESSIONNR
    	FROM
    	QPQD_LINK INNER JOIN
    	((((GBPRESTATIEGROEP INNER JOIN PATIENTS ON GBPRESTATIEGROEP.PATIENT = PATIENTS.P_KEY) INNER JOIN
    	RQ_EXAMS ON GBPRESTATIEGROEP.SLEUTEL = RQ_EXAMS.RQEX_REQUEST) INNER JOIN
    	EXAMS ON RQ_EXAMS.RQEX_EXAM = EXAMS.EX_KEY) INNER JOIN
    	MACHINES ON RQ_EXAMS.RQEX_MACHINE = MACHINES.MA_KEY) ON QPQD_LINK.QPQD_QD_RQEXAMKEY = RQ_EXAMS.RQEX_KEY
    	WHERE
    	GBPRESTATIEGROEP.PATIENT = PATIENTS.P_KEY AND
    	GBPRESTATIEGROEP.SLEUTEL = RQ_EXAMS.RQEX_REQUEST AND
    	RQ_EXAMS.RQEX_EXAM = EXAMS.EX_KEY AND
    	to_char(RQ_EXAMS.RQEX_DONE, 'dd/MM/YYYY') = '" .$today. "' AND
    	QPQD_LINK.QPQD_QD_RQEXAMKEY = RQ_EXAMS.RQEX_KEY AND
    	GBPRESTATIEGROEP.DEPARTMENT IN (SELECT S_KEY FROM SERVICES WHERE S_CODE In (".$CACsPrest.")) AND
    	(MACHINES.MA_NAME Like 'RXH SCAN%' OR MACHINES.MA_NAME Like 'RXH IRM%'
    	OR MACHINES.MA_NAME Like 'RXH CONV%' OR MACHINES.MA_NAME Like 'RXH VASC%'
    	OR MACHINES.MA_NAME Like 'RAC SCAN%')
    	ORDER BY MACHINES.MA_NAME, RQ_EXAMS.RQEX_DONE
    Or avec cette requête, DATERDV et PAT_NAIDATE s'affichent au format "DD/MM/YY" ! Et pour le premier il me faut juste l'heure au format "HH:ii"et pour le second il me la faut au format "DD/MM/YYYY" !

    Sur le forum, j'ai bien vu la fonction TO_CHAR.
    En l'utilisant sur PAT_NAIDATE de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	TO_CHAR(PATIENTS.P_BORN, 'dd/MM/YYYY') AS PAT_NAIDATE,
    Il n'y a aucun problème j'obtiens bien le format "DD/MM/YYYY" voulu !

    Mais lorsque je l'applique à DATERDV de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	TO_CHAR(RQ_EXAMS.RQEX_DONE, 'dd/MM/YYYY') AS DATERDV,
    J'obtiens une erreur dans la requête et rien ne s'affiche !
    Or ces deux champs sont bien de type Date/heure dans la base de données...

    J'espère que vous pourrez m'aider à y voir plus clair ?

    Merci.

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Peut-on voir une description de la table en question (desc table sous sqlplus) qui montre les deux zones avec leur type de données ?
    Et si ce n'est pas trop l'erreur rencontrée ?

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Dans les deux cas, si ce sont bien des champs date comme mnitu souhaite le vérifier, le code suivant fonctionnera et sera plus précis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_CHAR(<col_date>, 'DD/MM/YYYY HH24:MI:SS')

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 36
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Peut-on voir une description de la table en question (desc table sous sqlplus) qui montre les deux zones avec leur type de données ?
    Et si ce n'est pas trop l'erreur rencontrée ?
    En fait je suis en stage et je n'ai pas accés à ce que je veux... La base de données se trouve sur un serveur. Et sur le PC où je bosse, il y a WAMPServer d'installé et pas de SQL*Plus...

    Mais avec cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from user_tab_columns where table_name='RQ_EXAMS'
    (Est-ce que c'est ce que tu veux ?)

    J'ai réussi à avoir ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [TABLE_NAME] => RQ_EXAMS [COLUMN_NAME] => RQEX_DONE [DATA_TYPE] => DATE [DATA_TYPE_MOD] => [DATA_TYPE_OWNER] => [DATA_LENGTH] => 7 [DATA_PRECISION] => [DATA_SCALE] => [NULLABLE] => Y [COLUMN_ID] => 4 [DEFAULT_LENGTH] => [DATA_DEFAULT] => [NUM_DISTINCT] => 50814 [LOW_VALUE] => [HIGH_VALUE] => [DENSITY] => ,0000203574773014128 [NUM_NULLS] => 0 [NUM_BUCKETS] => 254 [LAST_ANALYZED] => 09/06/09 [SAMPLE_SIZE] => 7229 [CHARACTER_SET_NAME] => [CHAR_COL_DECL_LENGTH] => [GLOBAL_STATS] => YES [USER_STATS] => NO [AVG_COL_LEN] => 8 [CHAR_LENGTH] => 0 [CHAR_USED] => [V80_FMT_IMAGE] => NO [DATA_UPGRADED] => YES [HISTOGRAM] => HEIGHT BALANCED )
    Donc ce serait bien une date ?!

    Ensuite quand je remplace RQ_EXAMS avec PATIENTS, la table avec laquelle TO_CHAR fonctionne, j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [TABLE_NAME] => PATIENTS [COLUMN_NAME] => P_BORN [DATA_TYPE] => DATE [DATA_TYPE_MOD] => [DATA_TYPE_OWNER] => [DATA_LENGTH] => 7 [DATA_PRECISION] => [DATA_SCALE] => [NULLABLE] => N [COLUMN_ID] => 6 [DEFAULT_LENGTH] => [DATA_DEFAULT] => [NUM_DISTINCT] => 40902 [LOW_VALUE] => [HIGH_VALUE] => [DENSITY] => ,0000244486822160286 [NUM_NULLS] => 0 [NUM_BUCKETS] => 1 [LAST_ANALYZED] => 23/06/09 [SAMPLE_SIZE] => 1889847 [CHARACTER_SET_NAME] => [CHAR_COL_DECL_LENGTH] => [GLOBAL_STATS] => YES [USER_STATS] => NO [AVG_COL_LEN] => 8 [CHAR_LENGTH] => 0 [CHAR_USED] => [V80_FMT_IMAGE] => NO [DATA_UPGRADED] => YES [HISTOGRAM] => NONE )


    Après concernant l'erreur de ce Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    SELECT DISTINCT 
    	MACHINES.MA_NAME,
    	TO_CHAR(RQ_EXAMS.RQEX_DONE,'HH24:MI:SS') AS DATERDV,
    	PATIENTS.P_NATNUMBER,
    	PATIENTS.P_NAME AS PAT_NOM,
    	PATIENTS.P_FNAME AS PAT_PREN,
    	PATIENTS.P_PARTNER AS PATMAR_NOM,
    	TO_CHAR(PATIENTS.P_BORN, 'DD/MM/YYYY') AS PAT_NAIDATE,
    	PATIENTS.P_SEX AS PAT_SEXE,
    	EXAMS.EX_NAME,
    	QPQD_LINK.QPQD_ACCESSIONNR
    	FROM
    	QPQD_LINK INNER JOIN
    	((((GBPRESTATIEGROEP INNER JOIN PATIENTS ON GBPRESTATIEGROEP.PATIENT = PATIENTS.P_KEY) INNER JOIN
    	RQ_EXAMS ON GBPRESTATIEGROEP.SLEUTEL = RQ_EXAMS.RQEX_REQUEST) INNER JOIN
    	EXAMS ON RQ_EXAMS.RQEX_EXAM = EXAMS.EX_KEY) INNER JOIN
    	MACHINES ON RQ_EXAMS.RQEX_MACHINE = MACHINES.MA_KEY) ON QPQD_LINK.QPQD_QD_RQEXAMKEY = RQ_EXAMS.RQEX_KEY
    	WHERE
    	GBPRESTATIEGROEP.PATIENT = PATIENTS.P_KEY AND
    	GBPRESTATIEGROEP.SLEUTEL = RQ_EXAMS.RQEX_REQUEST AND
    	RQ_EXAMS.RQEX_EXAM = EXAMS.EX_KEY AND
    	to_char(RQ_EXAMS.RQEX_DONE, 'dd/MM/YYYY') = '" .$today. "' AND
    	QPQD_LINK.QPQD_QD_RQEXAMKEY = RQ_EXAMS.RQEX_KEY AND
    	GBPRESTATIEGROEP.DEPARTMENT IN (SELECT S_KEY FROM SERVICES WHERE S_CODE In (".$CACsPrest.")) AND
    	(MACHINES.MA_NAME Like 'RXH SCAN%' OR MACHINES.MA_NAME Like 'RXH IRM%'
    	OR MACHINES.MA_NAME Like 'RXH CONV%' OR MACHINES.MA_NAME Like 'RXH VASC%'
    	OR MACHINES.MA_NAME Like 'RAC SCAN%')
    	ORDER BY MACHINES.MA_NAME, RQ_EXAMS.RQEX_DONE
    Voilà exactement ce qui est affiché :
    Warning: ora_do() [function.ora-do]: ORA-01791: not a SELECTed expression -- while processing OCI function ODESCR in C:\Program Files\wamp\www\Mail\essai.php on line 115

    Warning: ora_columnname(): supplied argument is not a valid Oracle-Cursor resource in C:\Program Files\wamp\www\Mail\essai.php on line 162

    Notice: Undefined offset: 0 in C:\Program Files\wamp\www\Mail\essai.php on line 162

    Warning: ora_do() [function.ora-do]: ORA-01791: not a SELECTed expression -- while processing OCI function ODESCR in C:\Program Files\wamp\www\Mail\essai.php on line 168

    Warning: ora_fetch(): supplied argument is not a valid Oracle-Cursor resource in C:\Program Files\wamp\www\Mail\essai.php on line 170
    J'espère que vous pourrez m'aider avec ces infos ?

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Voilà l'erreur
    ORA-01791 not a SELECTed expression

    Cause: There is an incorrect ORDER BY item. The query is a SELECT DISTINCT query with an ORDER BY clause. In this context, all ORDER BY items must be constants, SELECT list expressions, or expressions whose operands are constants or SELECT list expressions.

    Action: Remove the inappropriate ORDER BY item from the SELECT list and retry the statement.
    Pourriez-vous faire un essaie sans mettre la clause ORDER BY ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 36
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Pourriez-vous faire un essaie sans mettre la clause ORDER BY ?
    Magnifique ce code fonctionne comme je le voulais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    SELECT DISTINCT 
    	MACHINES.MA_NAME,
    	TO_CHAR(RQ_EXAMS.RQEX_DONE, 'HH24:MI') AS DATERDV,
    	PATIENTS.P_NATNUMBER,
    	PATIENTS.P_NAME AS PAT_NOM,
    	PATIENTS.P_FNAME AS PAT_PREN,
    	PATIENTS.P_PARTNER AS PATMAR_NOM,
    	TO_CHAR(PATIENTS.P_BORN, 'DD/MM/YYYY') AS PAT_NAIDATE,
    	PATIENTS.P_SEX AS PAT_SEXE,
    	EXAMS.EX_NAME,
    	QPQD_LINK.QPQD_ACCESSIONNR
    	FROM
    	QPQD_LINK INNER JOIN
    	((((GBPRESTATIEGROEP INNER JOIN PATIENTS ON GBPRESTATIEGROEP.PATIENT = PATIENTS.P_KEY) INNER JOIN
    	RQ_EXAMS ON GBPRESTATIEGROEP.SLEUTEL = RQ_EXAMS.RQEX_REQUEST) INNER JOIN
    	EXAMS ON RQ_EXAMS.RQEX_EXAM = EXAMS.EX_KEY) INNER JOIN
    	MACHINES ON RQ_EXAMS.RQEX_MACHINE = MACHINES.MA_KEY) ON QPQD_LINK.QPQD_QD_RQEXAMKEY = RQ_EXAMS.RQEX_KEY
    	WHERE
    	GBPRESTATIEGROEP.PATIENT = PATIENTS.P_KEY AND
    	GBPRESTATIEGROEP.SLEUTEL = RQ_EXAMS.RQEX_REQUEST AND
    	RQ_EXAMS.RQEX_EXAM = EXAMS.EX_KEY AND
    	to_char(RQ_EXAMS.RQEX_DONE, 'dd/MM/YYYY') = '" .$today. "' AND
    	QPQD_LINK.QPQD_QD_RQEXAMKEY = RQ_EXAMS.RQEX_KEY AND
    	GBPRESTATIEGROEP.DEPARTMENT IN (SELECT S_KEY FROM SERVICES WHERE S_CODE In (".$CACsPrest.")) AND
    	(MACHINES.MA_NAME Like 'RXH SCAN%' OR MACHINES.MA_NAME Like 'RXH IRM%'
    	OR MACHINES.MA_NAME Like 'RXH CONV%' OR MACHINES.MA_NAME Like 'RXH VASC%'
    	OR MACHINES.MA_NAME Like 'RAC SCAN%')
    	ORDER BY MACHINES.MA_NAME, DATERDV
    Merci beaucoup d'avoir remarqué le ORDER BY alors que je m'acharnais sur le TO_CHAR !!

  7. #7
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Citation Envoyé par lekev62 Voir le message
    En fait je suis en stage et je n'ai pas accés à ce que je veux... La base de données se trouve sur un serveur. Et sur le PC où je bosse, il y a WAMPServer d'installé et pas de SQL*Plus...
    Juste en passant, tu peux consulter la description de tes tables en requettant les vues dba_ ou all_ ou user_.

    Par exemple, pour avoir toutes les infos sur tes colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM dba_tab_cols
    WHERE table_name = 'QPQD_LINK'
    Dans le même genre, tu peux avoir des informations sur tous les objets de BD. dba_tables, dba_indexes, ...

    La liste et la description de ces vues dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from dictionary

Discussions similaires

  1. Pb de requête qui marche une fois sur deux
    Par emulamateur dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 26/04/2011, 16h45
  2. Réponses: 2
    Dernier message: 07/02/2011, 09h39
  3. [MySQL] Une requête qui ne marche pas sur tous les enregistrements
    Par Marc22 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 21/04/2010, 13h20
  4. Requête qui ne marche pas sur une table Joomla.
    Par tintin72 dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/02/2010, 17h51
  5. Requête qui fonctionne 1 fois sur 100
    Par nicotine002 dans le forum Langage
    Réponses: 1
    Dernier message: 05/08/2006, 11h42

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