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

Interfaces de programmation Oracle Discussion :

[OCILIB] OCI_BindArrayOfDates : dates erronées


Sujet :

Interfaces de programmation Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Par défaut [OCILIB] OCI_BindArrayOfDates : dates erronées
    Bonjour,

    Je découvre OCILIB qui me semble un excellent outil, mais je bute sur l'utilisation de la fonction OCI_BindArrayOfDates. Je dois trés probablement faire une erreur quelque part.

    Je dois appeler des procédures stockées en passant des paramètres IN simples ou tableaux, de types entiers, chaines, ou dates.
    Aucun soucis avec les entiers et les chaines

    Pour les dates, la fonction OCI_BindDate fonctionne parfaitement. Par contre la fonction OCI_BindArrayOfDates passe des données incorrectes au moment de l'exécution (ex : 00/00/54).
    j'utilise (exemple avec tableau de 1 élément):
    OCI_Date * tab_date[1];
    tab_date[0] = OCI_DateCreate(NULL);
    OCI_BindArrayOfDates(stmt, szName, (OCI_Date **) tab_date, 1);


    Bizarrement, il y a une facon pas trés propre de contourner le problème si le tableau ne comporte qu'un seul élément :
    OCI_BindArrayOfDates(stmt, szName, (OCI_Date **) tab_date[0], 1);

    Quelqu'un a t'il déjà rencontré le problème ?

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    salut,

    quelle version de OCILIB utilises tu ?

    Ce bug eu existé dans OCILIB mais a été corrigé dans des versions antérieures... ( a moins que j'ai oublié de le corrigé ?).

    Je contrôle mes changelogs... Si le bug n'avait pas été corrigé, je le fixerai pour la v3.3.0 qui sort d'ici 15 jours ...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Si, le b ug avait ét corrigé...

    en fait, ton appel à OCI_BindArrayOfdate() est erroné.

    Si tu veux lier une tableau de OCI_Date à une statement SQL (et non PL/SQL) il faut passer 0 en dernier paramètres et appeler avant OCI_BindArraySetsize()

    Le derniere paramétre de BindArrayOfdate() sert pour lier des tableau à des paramères PL/SQL de type PL/SQL tables.

    donc, il te faut faire pour statement SQL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    OCI_BindArraySetSize(stmt, 1);
    OCI_BindArrayOfDates(stmt, szName, (OCI_Date **) tab_date, 0);
    Par contre si ton statement est un block PL/SQL, postes ton code...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Par défaut
    Merci beaucoup pour la réponse ultra rapide. Je suis impressionné.

    J'utilise la dernière version OCILIB 3.2.0 (ociliba.dll du 18/04/2009).
    La dll OCI est la version 9.2.0.1.0 du 01/05/2002.
    (Mon entreprise a toujours un train de retard sur les mises à jour.

    Ma requête est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "begin PCK_WS.MAJ_STOCK_WS_2(:Nb_Mvt,:date_mvt,:type_mvt,:mag,:ref,:lot,:four,:pack,:qte_initiale);end;"

    La déclaration de procedure stockée dans le package est :
    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
     
     TYPE Tab_Date_Mvt IS TABLE OF DATE
    	INDEX BY BINARY_INTEGER ;
     
      TYPE Tab_Type_Mvt IS TABLE OF VARCHAR2(1)
    	 INDEX BY BINARY_INTEGER ;
     
      TYPE Tab_Mag IS TABLE OF VARCHAR2(3)
    	 INDEX BY BINARY_INTEGER ;
     
      TYPE Tab_Ref IS TABLE OF VARCHAR2(18)
    	 INDEX BY BINARY_INTEGER ;
     
      TYPE Tab_Lot IS TABLE OF VARCHAR2(10)
    	 INDEX BY BINARY_INTEGER ;
     
      TYPE Tab_four IS TABLE OF VARCHAR2(10)
    	 INDEX BY BINARY_INTEGER ;
     
     TYPE Tab_packID IS TABLE OF VARCHAR2(25) 
    	 INDEX BY BINARY_INTEGER ;
     
     TYPE Tab_Qte_Initiale2 IS TABLE OF VARCHAR2(16) 
    	 INDEX BY BINARY_INTEGER 
     
     PROCEDURE MAJ_STOCK_WS_2
          ( Nb_Mvt       IN NUMBER,
            date_mvt     IN Tab_Date_Mvt,
            type_mvt     IN Tab_Type_Mvt,
            mag          IN Tab_Mag,
            ref          IN Tab_Ref,
            lot          IN Tab_Lot,
            four         IN Tab_four,
            packID       IN Tab_PackID,
            qte_initiale IN Tab_Qte_Initiale2
          );"
    C'est le premier paramètre qui pose problème.
    J'ai l'impression, mais je me trompe peut être, que la librairie OCI sous jacente attend un buffer avec toutes les structures OciDate contigues.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Par défaut
    Pour info, voici le code source de la partie cliente ainsi que le résultat dans la base :
    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
     
    	OCI_Statement * stmt;
    	int iNb_Mvt;
    	OCI_Date * odDateMvt[2];
    	char szTypeMvt[2][2];
    	char szMag[2][4];
    	char sRef[2][19];
    	char szLot[2][11];
    	char szFour[2][11];
    	char szPack[2][26];
    	char szQteInitiale[2][17];
     
    	stmt = OCI_StatementCreate(m_hOciConn);
    	if (!OCI_Prepare(stmt, "begin PCK_WS.MAJ_STOCK_WS_2(:Nb_Mvt,:date_mvt,:type_mvt,:mag,:ref,:lot,:four,:pack,:qte_initiale);end;"))
    		return false;
     
    	// Affectation des valeurs
    	iNb_Mvt = 2;
     
    	odDateMvt[0] = OCI_DateCreate(NULL);
    	OCI_DateFromText(odDateMvt[0], "20090606 141121", "YYYYMMDD HH24MISS");
    	odDateMvt[1] = OCI_DateCreate(NULL);
    	OCI_DateFromText(odDateMvt[1], "20090606 141525", "YYYYMMDD HH24MISS");
     
    	for (int i = 0; i < iNb_Mvt; i++)
    	{
    		strcpy(szTypeMvt[i], "E");
    		strcpy(szMag[i], "MBA");
    		strcpy(sRef[i], "A2C00000345A");
    		strcpy(szLot[i], "0103450905");
    		strcpy(szFour[i], "010345");
    		strcpy(szPack[i], "S123456");
    		strcpy(szQteInitiale[i], "0000025");
    	}
     
    	//Bind
    	OCI_BindInt(stmt, ":Nb_Mvt", (int *) &iNb_Mvt);
    	OCI_BindArrayOfDates(stmt, ":date_mvt", (OCI_Date **) odDateMvt, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":type_mvt", (char *) szTypeMvt, 1, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":mag", (char *) szMag, 3, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":ref", (char *) sRef, 18, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":lot", (char *) szLot, 10, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":four", (char *) szFour, 10, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":pack", (char *) szPack, 25, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":qte_initiale", (char *) szQteInitiale, 16, iNb_Mvt);
     
    	OCI_Execute(stmt);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INDX_HISTO DATE_MVT TY CODE_ COD REF_COMP           CODE_LOT   FOURNISSEU PACKAGEID                 QTE_INI    QTE_MVT ST PL CA PR E SOURCE_MVT
    ---------- -------- -- ----- --- ------------------ ---------- ---------- ------------------------- ------- ---------- -- -- -- -- - ----------------
       1608397 00/57/40 E  00001 MBA A2C00000345A       0103450905 010345     S123456                   25              25 01 01 01      WSPIC
       1608398 00/00/00 E  00001 MBA A2C00000345A       0103450905 010345     S123456                   25              25 01 01 01      WSPIC
    Par contre si on passe un pointeur sur le premier élément du tableau ça fonctionne (mais uniquement pour celui ci)
    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
    	OCI_Statement * stmt;
    	int iNb_Mvt;
    	OCI_Date * odDateMvt[2];
    	char szTypeMvt[2][2];
    	char szMag[2][4];
    	char sRef[2][19];
    	char szLot[2][11];
    	char szFour[2][11];
    	char szPack[2][26];
    	char szQteInitiale[2][17];
    
    	stmt = OCI_StatementCreate(m_hOciConn);
    	if (!OCI_Prepare(stmt, "begin PCK_WS.MAJ_STOCK_WS_2(:Nb_Mvt,:date_mvt,:type_mvt,:mag,:ref,:lot,:four,:pack,:qte_initiale);end;"))
    		return false;
    
    	// Affectation des valeurs
    	iNb_Mvt = 1;
    
    	odDateMvt[0] = OCI_DateCreate(NULL);
    	OCI_DateFromText(odDateMvt[0], "20090606 141121", "YYYYMMDD HH24MISS");
    //	odDateMvt[1] = OCI_DateCreate(NULL);
    //	OCI_DateFromText(odDateMvt[1], "20090606 141525", "YYYYMMDD HH24MISS");
    
    	for (int i = 0; i < iNb_Mvt; i++)
    	{
    		strcpy(szTypeMvt[i], "E");
    		strcpy(szMag[i], "MBA");
    		strcpy(sRef[i], "A2C00000345A");
    		strcpy(szLot[i], "0103450905");
    		strcpy(szFour[i], "010345");
    		strcpy(szPack[i], "S123456");
    		strcpy(szQteInitiale[i], "0000025");
    	}
    
    	//Bind
    	OCI_BindInt(stmt, ":Nb_Mvt", (int *) &iNb_Mvt);
    	OCI_BindArrayOfDates(stmt, ":date_mvt", (OCI_Date **) odDateMvt[0], iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":type_mvt", (char *) szTypeMvt, 1, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":mag", (char *) szMag, 3, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":ref", (char *) sRef, 18, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":lot", (char *) szLot, 10, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":four", (char *) szFour, 10, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":pack", (char *) szPack, 25, iNb_Mvt);
    	OCI_BindArrayOfStrings(stmt, ":qte_initiale", (char *) szQteInitiale, 16, iNb_Mvt);
    
    	OCI_Execute(stmt);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INDX_HISTO DATE_MVT TY CODE_ COD REF_COMP           CODE_LOT   FOURNISSEU PACKAGEID                 QTE_INI    QTE_MVT ST PL CA PR E SOURCE_MVT
    ---------- -------- -- ----- --- ------------------ ---------- ---------- ------------------------- ------- ---------- -- -- -- -- - ----------------
       1608399 06/06/09 E  00001 MBA A2C00000345A       0103450905 010345     S123456                   25              25 01 01 01      WSPIC

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Salut,

    je regarde ce problème et t'envoie éventuellement un patch si nécessaire...

    Envoie moi un mail (adresse dans le package ocilib) afin que je puisse te l'envoyer...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  7. #7
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Salut,

    en fait il s'agit d'un bug introduit en v3.2.0... que je viens de corriger dans la version de développement V3.3.0.

    Je mettrai à jour le svn d'ici demain soir.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

Discussions similaires

  1. [XL-MAC 2011] date erronée sur graphique excel 2011
    Par devjfp dans le forum Excel
    Réponses: 2
    Dernier message: 10/11/2011, 17h52
  2. Affichage de dates erronées avec fichier CSV
    Par The Molo dans le forum Excel
    Réponses: 4
    Dernier message: 27/12/2008, 12h06
  3. Date erronée avec lotus notes
    Par passion_info dans le forum Lotus Notes
    Réponses: 1
    Dernier message: 03/12/2008, 16h24
  4. Controle de date erroné
    Par jcachico dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/02/2008, 14h35
  5. requete avec tri sur date erronée
    Par olivll dans le forum Access
    Réponses: 11
    Dernier message: 20/10/2005, 15h45

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