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-01830: Le modèle du format de date se termine avant la conversion de la chaîne d'entrée entière


Sujet :

PL/SQL Oracle

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut ORA-01830: Le modèle du format de date se termine avant la conversion de la chaîne d'entrée entière


    J'ai un petit problème concernant les dates/heures dans une de mes 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
    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
       PROCEDURE get_datas (p_id_do        IN     VARCHAR2,
                            p_id_sonde     IN     NUMBER,
                            p_tpe          IN     VARCHAR2,
                            p_date_debut   IN     DATE,
                            p_date_fin     IN     DATE,
                            p_cur             OUT r_cursor)
       IS
          v_sql             VARCHAR2 (4000);
          v_sql_surverses   VARCHAR2 (4000);
          v_sql_mesures     VARCHAR2 (4000);
          v_sql_debits      VARCHAR2 (4000);
          v_sql_dual        VARCHAR2 (4000);
          v_sql_dates       VARCHAR2 (4000);
       BEGIN
          v_sql_surverses :=
                'SELECT sur.dte, ROUND (sur.val, 2) AS val, son.id_pos '
             || 'FROM t_surverse sur, t_sondes son '
             || 'WHERE sur.id_do = '''
             || p_id_do
             || ''' '
             || 'AND son.id_sonde = sur.id_sonde ';
     
          v_sql_mesures :=
                'SELECT m.dte, ROUND (m.val, 2) AS val, son.id_pos '
             || 'FROM t_mesures m, t_sondes son '
             || 'WHERE m.id_do = '''
             || p_id_do
             || ''' '
             || 'AND son.id_sonde = m.id_sonde '
             || 'AND son.id_sonde NOT IN (SELECT id_sonde FROM t_sondes WHERE etat = 0) ';
     
          v_sql_debits :=
                'SELECT d.dte, ROUND (d.val, 2) AS val, '
             || 'DECODE (d.source, '
             || '''PACKDO'', ''Débit calculé'', '
             || '''MAESTRO'', (SELECT id_pos FROM t_sondes '
             || 'WHERE id_do = '''
             || p_id_do
             || ''' '
             || 'AND id_sonde = d.id_sonde)) id_pos '
             || 'FROM t_debits d '
             || 'WHERE d.id_do = '''
             || p_id_do
             || ''' ';
     
          v_sql_dual :=
                'SELECT TO_DATE (NULL) AS DTE, '
             || 'TO_NUMBER (NULL) AS VAL, '
             || 'NULL AS POS '
             || 'FROM DUAL ';
     
          FOR r
             IN (SELECT *
                   FROM t_periodes
                  WHERE     id_do = p_id_do
                        AND dte_debut BETWEEN TO_DATE (p_date_debut,
                                                       'DD/MM/YYYY HH24:MI:SS')
                                          AND TO_DATE (p_date_fin,
                                                       'DD/MM/YYYY HH24:MI:SS'))
          LOOP
             v_sql_dates :=
                   v_sql_dates
                || 'AND dte NOT BETWEEN TO_DATE('''
                || TO_CHAR (r.dte_debut, 'DD/MM/YYYY HH24:MI:SS')
                || ''', ''DD/MM/YYYY HH24:MI:SS'') '
                || 'AND TO_DATE('''
                || TO_CHAR (r.dte_fin, 'DD/MM/YYYY HH24:MI:SS')
                || ''', ''DD/MM/YYYY HH24:MI:SS'') ';
          END LOOP;
     
          IF p_tpe = 'TOUT'
          THEN
             v_sql := v_sql || v_sql_surverses;
             v_sql := v_sql || v_sql_dates;
             v_sql := v_sql || ' UNION ';
             v_sql := v_sql || v_sql_mesures;
             v_sql := v_sql || v_sql_dates;
             v_sql := v_sql || ' UNION ';
             v_sql := v_sql || v_sql_debits;
             v_sql := v_sql || v_sql_dates;
             v_sql := v_sql || ' ORDER BY dte';
          ELSIF p_tpe = 'DEBIT'
          THEN
             v_sql := v_sql || v_sql_debits;
             v_sql := v_sql || v_sql_dates;
             v_sql := v_sql || ' ORDER BY dte';
          ELSE
             /* Ne fait rien, c'est juste pour récupérer la structure de la
               requête dans le DataSet côté VB */
             v_sql := v_sql || v_sql_dual;
          END IF;
     
          DBMS_OUTPUT.put_line (v_sql);
     
          OPEN p_cur FOR v_sql;
       END;
    ORA-01830: Le modèle du format de date se termine avant la conversion de la chaîne d'entrée entière
    Les dates entrées sont dans le format suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR REPLACE PROCEDURE PACKDO.test_packdo
    IS
       TYPE r_cursor IS REF CURSOR;
     
       p_cur   r_cursor;
    BEGIN
       packdo.pkg_visualisation.get_datas ('DO-07088',
                                           NULL,
                                           'TOUT',
                                           '01/07/2015 01:00:00',
                                           '01/08/2015 15:00:00',
                                           p_cur);
    END;
    /
    Les dates sont normalement entrées via une application web en ASP.Net/VB.Net et je les parse pour être sûr que tout va bien:
    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                    Try
                        dateDebut = DateTime.ParseExact(txtDateDebut.Text.Trim() & " " & heureDebut, "dd/MM/yyyy HH:mm:ss", New CultureInfo("fr-FR"))
                    Catch ex As Exception
                        divMsgErr.Visible = True
                        lblMsgErr.Text = "La date de début n'est pas dans le bon format !!<br />"
                    End Try
                    Try
                        dateFin = DateTime.ParseExact(txtDateFin.Text.Trim() & " " & heureFin, "dd/MM/yyyy HH:mm:ss", New CultureInfo("fr-FR"))
                    Catch ex As Exception
                        divMsgErr.Visible = True
                        lblMsgErr.Text = lblMsgErr.Text & "La date de fin n'est pas dans le bon format !!"
                    End Try
    Rien y fait, je vois pas du tout comment faire... Si un spécialiste en la matière pourrait m'aider, j’apprécierais grandement


    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    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
    Lors de l'appel de la procédure la valeur passée pour le paramètre p_date_deb est '01/07/2015 01:00:00' ce qui est une chaine des caractères et non pas une date. Comme le type "chaine de caractère" est différente du type "date" Oracle fera une conversion de la chaine des caractères vers le type date en utilisant le format par défaut (voir paramètres NLS pour le trouver). Donc commencez par vérifier ce format et surtout passez le type date en faisant vous-même la conversion:
    To_Date('01/07/2015 01:00:00','DD/MM/YYYY HH:MI:SS')

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Je suis d'accord pour l'appel que j'ai fait côté BDD pour les tests cependant, c'est le même résultat côté programme serveur alors que le type est bien Date voir DateTime ...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                            p_date_debut   IN     DATE,
                            p_date_fin     IN     DATE,
    .....
    .....
                        AND dte_debut BETWEEN TO_DATE (p_date_debut,
                                                       'DD/MM/YYYY HH24:MI:SS')
                                          AND TO_DATE (p_date_fin,
                                                       'DD/MM/YYYY HH24:MI:SS'))
    Par ailleurs dans la suite du code il ne faut pas faire de TO_DATE sur une colonne ou une variable de type date.
    Oracle va faire un TO_CHAR implicite sur la date, dépendant des paramétrages par défaut de la session, avant de faire le TO_DATE.

    Utilisez TRUNC pour réinitialiser la composante horaire si besoin.

    PS: vous êtes en risque d'injection SQL avec votre SQL dynamique non bindé :
    http://www.developpez.net/forums/d15...eur-dynamique/

  5. #5
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Bonjour,

    Ce qui me parait source à problème
    =>
    La fonction to_date est censé convertir un string en type date ?
    [GRILLAID] par skuatamad


    hors ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    TO_DATE (p_date_debut,
                                                       'DD/MM/YYYY HH24:MI:SS')
    ...
    la variable p_date_debut est défini déjà comme un champ de type date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p_date_debut   IN     DATE, ...
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

Discussions similaires

  1. [VxiR2] Pb date ORA-01830
    Par pititeju dans le forum Webi
    Réponses: 6
    Dernier message: 27/03/2012, 10h08
  2. Erreur : ORA-01821: format de date inconnu
    Par gaijinma dans le forum PL/SQL
    Réponses: 1
    Dernier message: 25/06/2010, 10h05
  3. [SQL*Loader] ORA-01830 problème de date
    Par StreM dans le forum SQL
    Réponses: 7
    Dernier message: 24/08/2009, 16h45
  4. Formater une date via un timestamp UNIX et un modèle modifiable
    Par Aldéhir dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 7
    Dernier message: 11/09/2007, 16h43
  5. Réponses: 2
    Dernier message: 02/12/2006, 09h00

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