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

PL/SQL Oracle Discussion :

ORA-00904 avec SQL dynamique


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé Avatar de pascal_T
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 95
    Par défaut ORA-00904 avec SQL dynamique
    Bonjour, voici le problème que j'ai, je souhaite éxécuter suivant les valeurs entrées par l'utilisateur un requête ou l'autre. Actuellement je butte sur l'exécution de la requête 1. Voici le script testé sous 1 client 9.2 windows et 1serveur 9.2 solaris.

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    ACCEPT mode CHAR PROMPT 'Voulez-vous travailler sur toute l''année ou pour un mois précis (O,o/N,n) '
    ACCEPT age CHAR PROMPT 'Saisisser l''age de la personne > : '
    ACCEPT date_saisie DATE FORMAT 'DD/MM/YYYY' 
    PROMPT 'Entrer la période de recherche au format JJ/MM/YYYY ou taper sur entré si recherche sur toute l''année : '
     
     
    declare
    date_travail date;
    requete1 varchar(1024) ;
    requete2 varchar(1024) ;
     
    begin
    requete1 := '
    SELECT nat.idf_agent                                             MATRICULE ,
    his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,
    to_char(date_travail,''YYYY'')-to_char(ide.dat_naissance,''YYYY'') AGE,
    to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.cod_coll =''toto''
    AND to_number( to_char( date_travail,''YYYY'' ) ) - to_number(to_char(ide.dat_naissance,''YYYY''))= &age
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <= date_travail
    AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') >    date_travail
    ORDER BY MATRICULE ';
    requete2 := '
    SELECT nat.idf_agent                                             MATRICULE ,
           his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,
           to_char(sysdate,''YYYY'')-to_char(ide.dat_naissance,''YYYY'') AGE,
           to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.cod_coll =''toto''
    AND to_number( to_char( date_travail,''YYYY'' ) ) - to_number(to_char(ide.dat_naissance,''YYYY''))= &age
    AND to_number(to_char(date_travail,''MM'')) = to_number(to_char(ide.dat_naissance,''MM''))
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <= date_travail
    AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') >    date_travail
    ORDER BY MATRICULE ';
    if ( '&mode' in ('O','o') ) then
    date_travail := sysdate;
    execute immediate requete1 ;
    else 
    date_travail := to_date ('&date_saisie','DD/MM/YYYY');
    execute immediate requete2;
    end if;
     
    end; 
    /

    Quand je rentre 'O' et laisse la date vide alors celà me génère l'erreur suivante:

    Error at line 11
    ORA-00904: "DATE_TRAVAIL" : identificateur non valide
    ORA-06512: à ligne 44
    J'ai tout essayé et je ne vois ce qui ne vas pas
    QUi pourrait éclairer ma lanterne

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Par défaut
    Salut,

    En fait, dans tes requêtes dynamiques, Oracle s'attend à trouver une colonne qui s'appelle "date_travail". Il faut adapter tes requêtes et mettre l'assignation de date_travail au début de ton code.

    Voici pour requête1:

    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
     
    requete1 := '
    SELECT nat.idf_agent                                             MATRICULE ,
    his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,
    to_char('''||date_travail||''',''YYYY'')-to_char(ide.dat_naissance,''YYYY'') AGE,
    to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.cod_coll =''toto''
    AND to_number( to_char( '''||date_travail||''',''YYYY'' ) ) - to_number(to_char(ide.dat_naissance,''YYYY''))= &age
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <= '''||date_travail||
    ''' AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') >    '''||date_travail||
    ''' ORDER BY MATRICULE ';
    Attention au format date prédéfini. Peut-être que tu devras faire à chaque fois un to_char(date_travail) dans le bon format.

  3. #3
    Membre confirmé Avatar de pascal_T
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 95
    Par défaut
    Suite à ta réponse j'ai remis en forme la requête mais à présent j'ai un message d'erreur. que j'exécute la requête 1 ou 2 il me met une erreur.

    Soit le nouvau 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    ACCEPT mode CHAR PROMPT 'Voulez-vous travailler sur toute l''année ou pour un mois précis (O,o/N,n) ';
    ACCEPT age char PROMPT 'Saisisser l''age de la personne > : ';
    ACCEPT date_saisie DATE FORMAT 'DD/MM/YYYY'  PROMPT 'Entrer la période de recherche au format JJ/MM/YYYY ou taper sur entré si recherche sur l''année : ';
     
     
    --@entete_portrait.sql &2
    set serveroutput on
    set echo on
    declare
    date_travail date;
    requete1 varchar(1024) ;
    requete2 varchar(1024) ;
     
    begin
     
    if ( '&mode' in ('O','o') ) then
    date_travail := sysdate;
    dbms_output.put_line('Date travail courante: ' ||date_travail);
    else 
    date_travail := to_date ('&date_saisie','DD/MM/YYYY');
    dbms_output.put_line('Date travail saisie : ' ||to_char(date_travail,'DD/MM/YYYY'));
    end if;
     
    requete1 := '
    SELECT nat.idf_agent                                             MATRICULE ,
    his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,
    to_char('||date_travail||',''YYYY'')-to_char(ide.dat_naissance,''YYYY'') AGE,
    to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.cod_coll =''toto''
    AND to_number( to_char( '||date_travail||',''YYYY'' ) ) - to_number(to_char(ide.dat_naissance,''YYYY''))= 65
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <= '||date_travail||'
    AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') >    '||date_travail||'
    ORDER BY MATRICULE ';
    requete2 := '
    SELECT nat.idf_agent                                             MATRICULE ,
           his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,
           to_char(sysdate,''YYYY'')-to_char(ide.dat_naissance,''YYYY'') AGE,
           to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.cod_coll =''toto''
    AND to_number( to_char( '|| date_travail|| ',''YYYY'' ) ) - to_number(to_char(ide.dat_naissance,''YYYY''))= 65
    AND to_number(to_char('||date_travail||',''MM'')) = to_number(to_char(ide.dat_naissance,''MM''))
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <= '||date_travail||'
    AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') >    '||date_travail||'
    ORDER BY MATRICULE ';
     
    if ( '&mode' in ('O','o') ) then
    dbms_output.put_line ('On passe dans la requete 1');
    execute immediate requete1 ;
    else 
    dbms_output.put_line ('On passe dans la requete 2');
    execute immediate requete2;
    end if;
     
    end; 
    /
    @sortie.sql
    Il met dans le cas de la requête 1 , l'erreur suivante

    Error at line 29
    ORA-00932: types de données incohérents : DATE attendu ; NUMBER obtenu
    ORA-06512: à ligne 54
    Pour la requête 2

    Error at line 29
    ORA-00932: types de données incohérents : DATE attendu ; NUMBER obtenu
    ORA-06512: à ligne 57
    J'avoue que je ne vois pas trop quel est le problème.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Le champ ide.dat_naissance est-il bien de format date ?

  5. #5
    Membre confirmé Avatar de pascal_T
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 95
    Par défaut
    J'ai avancé un peu dans mon problème, j'affiche à présent la requête qui st exécutée.

    dans le cas de la requête 1 j'ai :

    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
     
    SELECT nat.idf_agent                                             MATRICULE ,
    his.nom_usuel  || ' ' ||  his.Nom_prenom                  NOM_PRENOM,
    to_number(to_char(10/10/08,'YYYY'))-to_number(to_char(ide.dat_naissance,'YYYY')) AGE,
    to_char(ide.dat_naiss
    ance,'DD/MM/YYYY')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in ('0','2') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.cod_coll ='toto'
    AND to_number( to_char( 10/10/08,'YYYY' ) ) - to_number(to_char(ide.dat_naissance,'YYYY'))= 65
    AND to_date(to_char(his.dat_debut,'DD/MM/YYYY'),'DD/MM/YYYY') <= 10/10/08
    AND to_date(to_char(his.dat_fin,'DD/MM/Y
    YYY'),'DD/MM/YYYY') >    10/10/08
    ORDER BY MATRICULE
    Voici comment la requête est construite:
    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
     
    requete1 := '
    SELECT nat.idf_agent                                             MATRICULE ,
    his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,
    to_number(to_char('||date_travail||',''YYYY''))-to_number(to_char(ide.dat_naissance,''YYYY'')) AGE,
    to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.cod_coll =''toto''
    AND to_number( to_char( '||date_travail||',''YYYY'' ) ) - to_number(to_char(ide.dat_naissance,''YYYY''))= 65
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <= '||date_travail||'
    AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') >    '||date_travail||'
    ORDER BY MATRICULE ';
    Je pense que le problème vient des dates qui ne sont pas entre " ' ' , mais je n'arrive pas les faire apparaitre une fois la requête construite.

  6. #6
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Vous vous compliquez inutilement la tâche:
    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
     
    SQL> set serveroutput on
    SQL> 
    SQL> DECLARE
      2    d  DATE := SYSDATE ;
      3    v  VARCHAR2(1000);
      4    r  VARCHAR2(100);
      5  BEGIN
      6    v:= 'select ' || TO_CHAR(d,'YYYY') || ' from dual' ;
      7    EXECUTE IMMEDIATE v INTO r ;
      8    DBMS_OUTPUT.PUT_LINE(r);
      9  END; 
     10  
     11  /
    2008
     
    Procédure PL/SQL terminée avec succès.

  7. #7
    Membre confirmé Avatar de pascal_T
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 95
    Par défaut
    Voici la nouvelle requête suite à tes remarques:

    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
     
    requete1 := '
    SELECT nat.idf_agent                                             MATRICULE ,
    his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,  '
    ||to_number(to_char(date_travail,'YYYY'),'9999')||'-to_number(to_char(ide.dat_naissance,''YYYY'')) AGE,
    to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.cod_coll =''toto''
    AND '||to_number( to_char(date_travail,'YYYY' ),'9999' ) || ' - to_number(to_char(ide.dat_naissance,''YYYY'')) = 65
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <=' ||date_travail||
    ' AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') > '   ||date_travail||'
    ORDER BY MATRICULE ';
    Ce que donne la requête dynamique:

    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
     
     
    SELECT nat.idf_agent                                             MATRICULE ,
    his.nom_usuel  || ' ' ||  his.Nom_prenom                  NOM_PRENOM,  2008-to_number(to_char(ide.dat_naissance,'YYYY')) AGE,
    to_char(ide.dat_naissance,'DD/MM/YYYY')
           DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in ('0','2') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.c
    od_coll ='toto'
    AND 2008 - to_number(to_char(ide.dat_naissance,'YYYY')) = 65
    AND to_date(to_char(his.dat_debut,'DD/MM/YYYY'),'DD/MM/YYYY') <=10/10/08 AND to_date(to_char(his.dat_fin,'DD/MM/YYYY'),'DD/MM/YYYY') > 10/10/08
    ORDER BY MATRICULE
    Mais j'ai toujours l'erreur suivante:

    ORA-00932: types de données incohérents : DATE attendu ; NUMBER obtenu
    ORA-06512: à ligne 100
    Là j'avoue que je ne vois pas du tout le problème

  8. #8
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    et c'est quoi la ligne 100 ?

  9. #9
    Membre confirmé Avatar de pascal_T
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 95
    Par défaut
    Ah oui, c'est vrai que sans le script c'est un peu dur.
    Tu remarqueras, que je me suis permis d'utiliser ta fonction qui contourne la limitation des 225 caractères du dbms_output.put_line.
    Seule la requête 1 a été mise en forme, l'autre est à l'ancien style et à reprendre.:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
     
    ACCEPT mode CHAR PROMPT 'Voulez-vous travailler sur toute l''année ou pour un mois précis (O,o/N,n) ';
    ACCEPT age char PROMPT 'Saisisser l''age de la personne > : ';
    ACCEPT date_saisie DATE FORMAT 'DD/MM/YYYY'  PROMPT 'Entrer la période de recherche au format JJ/MM/YYYY ou taper sur entré si recherche sur l''année : ';
     
     
    --@entete_portrait.sql &2
    set serveroutput on
    set echo on
    declare
     
    date_travail date;
    requete1 varchar(1024) ;
    requete2 varchar(1024) ;
     
    procedure F_TRACE ( PC$Message in VARCHAR2, PC$Output in VARCHAR2 DEFAULT 'E' )
    Is
    PRAGMA AUTONOMOUS_TRANSACTION ;
      LC$Chaine Varchar2(4000) ;
      LN$Tranches	PLS_INTEGER ;
      LN$Reste  PLS_INTEGER ;
      LN$Pos	PLS_INTEGER := 1 ;
      LN$Inc	PLS_INTEGER ;
    Begin
     
      If PC$Output = 'E' Then
         -- Sortie sur ecran (DBMS_OUTPUT) --
    	 LN$Inc := 255 ;
    	 LN$Tranches := Length( PC$Message ) / LN$Inc ;
    	 LN$Reste    := MOD( Length( PC$Message ), LN$Inc ) ;
    	 If LN$Reste > 0 Then LN$Tranches := LN$Tranches + 1 ; End if ;
     
    	 -- Sortie --
    	 For i in 1..LN$Tranches Loop
    	    LC$Chaine := Substr( PC$Message, LN$Pos, LN$Inc ) ;
    		DBMS_OUTPUT.PUT_LINE( LC$Chaine ) ;
    		LN$Pos := LN$Pos + LN$Inc ;
    	 End loop ;
     
      Else
         -- Sortie sur table (INSERT) --
    	 LN$Inc := 4000 ;
    	 LN$Tranches := Length( PC$Message ) / LN$Inc ;
    	 LN$Reste    := MOD( Length( PC$Message ), LN$Inc ) ;
    	 If LN$Reste > 0 Then LN$Tranches := LN$Tranches + 1 ; End if ;
     
    	/* -- Sortie --
    	 For i in 1..LN$Tranches Loop
    	    LC$Chaine := Substr( PC$Message, LN$Pos, LN$Inc ) ;
    		Insert into TRACE (LIGNE) Values ( LC$Chaine ) ;
    		Commit ;
    		LN$Pos := LN$Pos + LN$Inc ;
    	 End loop ;
    	 */
      End if ;
     
    End F_TRACE;
     
    begin
     
    if ( '&mode' in ('O','o') ) then
    date_travail := sysdate;
    dbms_output.put_line('Date travail courante: ' ||to_char(date_travail,'DD/MM/YYYY'));
    else 
    date_travail := to_date ('&date_saisie','DD/MM/YYYY');
    dbms_output.put_line('Date travail saisie : ' ||to_char(date_travail,'DD/MM/YYYY'));
    end if;
     
    requete1 := '
    SELECT nat.idf_agent                                             MATRICULE ,
    his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,  '
    ||to_number(to_char(date_travail,'YYYY'),'9999')||'-to_number(to_char(ide.dat_naissance,''YYYY'')) AGE,
    to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.cod_coll =''toto''
    AND '||to_number( to_char(date_travail,'YYYY' ),'9999' ) || ' - to_number(to_char(ide.dat_naissance,''YYYY'')) = 65
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <=' ||date_travail||
    ' AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') > '   ||date_travail||'
    ORDER BY MATRICULE ';
    requete2 := '
    SELECT nat.idf_agent                                             MATRICULE ,
           his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,
           to_char(sysdate,''YYYY'')-to_char(ide.dat_naissance,''YYYY'') AGE,
           to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.cod_coll =''toto''
    AND to_number( to_char( '|| date_travail|| ',''YYYY'' ) ) - to_number(to_char(ide.dat_naissance,''YYYY''))= 65
    AND to_number(to_char('||date_travail||',''MM'')) = to_number(to_char(ide.dat_naissance,''MM''))
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <= '||date_travail||'
    AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') >    '||date_travail||'
    ORDER BY MATRICULE ';
     
    if ( '&mode' in ('O','o') ) then
    dbms_output.put_line ('On passe dans la requete 1');
    --dbms_output.put_line ('La requete est la suivante:'||requete1);
    f_trace (requete1);
    execute immediate requete1 ;
    else 
    dbms_output.put_line ('On passe dans la requete 2');
    execute immediate requete2;
    end if;
     
    end; 
    /
    Merci de ton aide.

  10. #10
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Voici un équivalent qui ajoute la fonction To_Number()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE
      d  DATE := SYSDATE ;
      v  VARCHAR2(1000);
      r  VARCHAR2(100);
    BEGIN
      v:= 'select to_number(''' || TO_CHAR(d,'YYYY') || ''') from dual' ;
      EXECUTE IMMEDIATE v INTO r ;
      DBMS_OUTPUT.PUT_LINE(r);
    END;

  11. #11
    Membre confirmé Avatar de pascal_T
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 95
    Par défaut
    Ca y est j'ai finit pas trouver ce qui n'allait pas!

    La nouvelle formulation de ma requête :

    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
     
    requete1 := '
    SELECT nat.idf_agent                                             MATRICULE ,
    his.nom_usuel  || '' '' ||  his.Nom_prenom                  NOM_PRENOM,  '
    ||to_number(to_char(date_travail,'YYYY'))||'-to_number(to_char(ide.dat_naissance,''YYYY'')) AGE,
    to_char(ide.dat_naissance,''DD/MM/YYYY'')                   DATE_NAISSANCE
    FROM OG.IDENT ide,
         OG.IDENT_HIS his,
         RH.AGTNAT nat 
    WHERE  ide.ident_id = his.ident_id
    AND    nat.ident_id  = his.ident_id
    AND   cod_gestion in (''0'',''2'') 
    and idf_agent in (select distinct idf_agent from agtpai)
    AND   nat.cod_coll =''toto''
    AND '|| to_number( to_char(date_travail,'YYYY' ))|| ' - to_number(to_char(ide.dat_naissance,''YYYY'')) = 65
    AND to_date(to_char(his.dat_debut,''DD/MM/YYYY''),''DD/MM/YYYY'') <='''||date_travail||
    ''' AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') > '''   ||date_travail||'''
    ORDER BY MATRICULE ';

    En fait mon problème se situait au niveau de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') > '''   ||date_travail||'''
    avant j'avais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ' AND to_date(to_char(his.dat_fin,''DD/MM/YYYY''),''DD/MM/YYYY'') > '   ||date_travail||'
    ce qui me donnait en requête dynamique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AND to_date(to_char(his.dat_fin,'DD/MM/Y
    YYY'),'DD/MM/YYYY') >    10/10/08
    Putain que j'en ai ch*é! Mais au moins je suis moins bête que ce matin.
    A bientôt pour de nouvelles aventures!

    Merci à vous tous

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

Discussions similaires

  1. [Core] [Hibernate][Oracle][TemporalType]ORA-00904 avec un type TemporalType
    Par amadoulamine1 dans le forum Hibernate
    Réponses: 1
    Dernier message: 19/02/2013, 20h33
  2. Fonction avec SQL 'dynamique'
    Par gillou13 dans le forum Développement
    Réponses: 3
    Dernier message: 24/08/2011, 10h08
  3. Procédure PL/SQL avec sql dynamique
    Par Fiona08 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 10/12/2010, 14h50
  4. delete avec sql dynamique
    Par dessinateurttuyen dans le forum PL/SQL
    Réponses: 10
    Dernier message: 09/06/2010, 10h52
  5. Réponses: 4
    Dernier message: 25/01/2006, 18h25

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