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 :

[Oracle9i] Requête dynamique et date


Sujet :

SQL Oracle

  1. #1
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut [Oracle9i] Requête dynamique et date
    Bonjour,

    Cela fait pas mal de temps que je planche sur le problème suivant :

    Dans une procédure stockée située dans un package, je construit une requête dynamique. La construction est de la forme suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    v_req := '
    insert into (...) (
      select ...
        from ...
      where ...
         and t.date1 < to_date(''' || to_char(vDate,'DD/MM/YYYY') || ''',''DD/MM/YYYY'')
         and t.date2 >= to_date(''' || to_char(vDate,'DD/MM/YYYY') || ''',''DD/MM/YYYY'')
         and ...
    )';
    Cela fonctionne chez moi en Oracle8i et Oracle9i.
    vDate est une variable globale de type DATE.

    Sur un autre environnement j'ai une erreur assez sévère d'Oracle. L'erreur remontée depend de l'environnement appelant (Plus de données sur le socket pour un appel jdbc, fin de fichier sur canal de communication depuis TOAD).
    Dans le fichier alert.log on a des erreurs de ce type : ORA-07445: exception encountered: core dump [] [] [] [] [] [].

    Si je remplace le to_date(...) par un bête sysdate cela fonctionne.

    Si je remplace vDate par une variable locale cela plante aussi.
    Si j'extrait la procédure dans un fichier sql, que j'initialise mes variables globales en début de procédure et que je lance ce fichier sql, cela fonctionne.

    Bref je ne comprend plus grand chose. J'ai essaye de changer mes parametres NLS_DATE_FORMAT & co chez moi pour tenter de reproduire mais sans succès.

    Merci d'avance pour vos idées.
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    En fait c'est la solution la moins sujette aux divers problèmes de formattage de date, vu que tu reconstruit la date à partir d'une chaine de caractère.

    Donc je ne vois pas pourquoi ça planterait.

    Essayes d'utiliser des bind variables pour tester
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    Sinon mettre en phase le format date dès le début du traitement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate 'alter session set nls_data_format=''DD/MM/YYYY''';
    ensuite, il ne sera plus nécessaire d'utiliser les fonctions de conversion to_date() et to_char()
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  4. #4
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par SheikYerbouti Voir le message
    Sinon mettre en phase le format date dès le début du traitement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate 'alter session set nls_data_format=''DD/MM/YYYY''';
    ensuite, il ne sera plus nécessaire d'utiliser les fonctions de conversion to_date() et to_char()
    Franchement, dans ce cas je ne vois pas comment.
    Il pourrair s'en passer plutôt en utilisant des variables de liaison (binding variables) (suggèré déjà par MCM)
    Sinon pour l'anomalie il faut chercher peut être sur Metalink, Ora-07445

  5. #5
    Expert éminent sénior
    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
    Points : 11 862
    Points
    11 862
    Par défaut
    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
    Connected to:
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
     
    SQL> select sysdate from dual;
     
    SYSDATE
    ---------
    22-APR-08
    SQL>
    SQL>  declare
      2  lc$date date;
      3  begin
      4  execute immediate 'alter session set nls_date_format=''dd/mm/yyyy''';
      5  lc$date := sysdate ;
      6  dbms_output.put_line(sysdate || '-' || lc$date);
      7  end;
      8  /
    22/04/2008-22/04/2008
     
    PL/SQL procedure successfully completed.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  6. #6
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    La solution avec les bind variables fonctionne.
    Mais je ne comprend toujours pas pourquoi ma solution ne fonctionnait pas dans cet environnement particulier.

    Je n'ai pas testé la solution de SheikYerbouti car d'une part j'avais la même question que mnitu et d'autre part, les tests étant effectués par le client maintenant qu'une solution est trouvée, je ne peux décemment leur demander d'effectuer d'autres tests (vu le nombre déjà effectué...)


    Merci à tous.
    Je ne met pas le tag Résolu car j'aimerai bien une explication ou du moins une piste d'explication, je n'aime pas avoir une solution sans comprendre l'origine initiale du problème.
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  7. #7
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Pour @SheikYerbouti
    Syntax
    DBMS_OUTPUT.PUT_LINE (
    item IN VARCHAR2);
    et pour que ça marche avec sysdate et lc$date Oracle fait une conversion to_char implicite (voilà la revenu par la fenêtre). Et se baser sur des conversions implicites ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      1  Select dump(sysdate), dump(sysdate||' ')
      2* from dual
     
    DUMP(SYSDATE)
    --------------------------------------------------------------------------------
    DUMP(SYSDATE||'')
    --------------------------------------------------------------------------------
    Typ=13 Len=8: 7,216,4,22,10,7,11,0
    Typ=1 Len=9: 50,50,47,48,52,47,48,56,32
    Pour @Drizzt
    Connais tu la valeur de la variable globale vDate avant d'éxécuter le code qui se plante ?

  8. #8
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Oui je l'ai vérifié.
    Et j'ai même remplacé cette dernière par une variable locale déclarée juste avant la requête sans succès.

    Par contre la même chose hors du package fonctionne (dans un fichier sql lancé depuis SQL+). Et la seule différence de paramètres de session est le NLS_DATE_FORMAT qui est à DD-MM-RR dans un cas et DD-MM-YY dans l'autre. Mais j'ai changé ce dernier dans mon environnement sans reproduire l'erreur (je n'ai pas pu tester dans l'autre sens, voir si l'erreur disparaissait chez le client).
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

Discussions similaires

  1. [JDBC] Requête avec une date sous la forme dd/MM/yyyy
    Par sylviefrfr dans le forum JDBC
    Réponses: 6
    Dernier message: 12/11/2005, 09h35
  2. [pb requête sql] Requête dynamique
    Par viny dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 15/09/2005, 12h31
  3. Erreur de conversion et requête dynamique dans une procédure
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2005, 15h12
  4. [Procs stockées] [Débutant] Requête dynamique
    Par stailer dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2005, 14h29
  5. Requête dynamique en pagination
    Par pascal_fluck@hotmail.com dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/03/2005, 16h04

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