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

C Discussion :

OCI-LIB - sélection en fonction de donnée optionelles


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 86
    Points : 26
    Points
    26
    Par défaut OCI-LIB - sélection en fonction de donnée optionelles
    Bonjour à tous,

    Actuellement je développe avec un collègue une application utilisant OCI Lib.
    Ce bout de code est développer en C et sera intégré sous forme de library.a dans un projet graphique QT.
    J’essaye de lui sortir une épine du pied pendant qu’il développe (il est plus proche que moi de la base de donnée mais à encore pas mal de travail avant d'avoir à résoudre se soucis).

    Nous avons aujourd’hui une entête de type :

    Int select_client(S_client client-in, S_client * client-out[]).

    Comme c’est lui qui développe cette partie je ne sais pas s’il a exactement ça, mais ça doit être très proche.
    Le but est de rentrer les données qu’on a sur le client qu'on souhaite trouver dans la structure client in, par exemple nom / prénom, et la fonction renvois une liste de réponse en fonction des valeurs saisie.

    dans le code on aurait quelque chose comme :

    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
     
     
    If(client.nom != null)
    {
     
    	//ajout de la recherche nom dans la requête
     
    }
    If(client.prenom != null)
    {
     
    	//ajout de la recherche prénom dans la requête
     
    }
     
    //et ainsi de suite pour toutes les données, 
    //avant d'executer à la fin la requête concaténé avec les ifs du haut.
    Mon collègue assez proche de OCI-lib m'explique qu'une requête ce fait en plusieurs fois dans le cas d'un select :

    - OCI_EecuteStmt (prépare la requête à être executer)
    - OCI_Bind (remplace les variables dans la requête par les valeurs réelles).

    Avec cette méthode, je ne peux pas composer ma requête en détectant les valeurs que j'ai pour la selection avant d'excuter, le type de la requête n'est pas un char *, mais du " const mtext * " ....

    N'y à-t'il rien qui me permette de créer une requête de type char par exemple ?

    L'intérêt final serait de composé ma requête à la volé en traversant les divers " si j'ai un prénom alors je cherche en fonction et j'ajoute à ma requête ",

    OCI_ExecuteStmt oblige à faire les binds encore une fois en fonction des données que j'ai en entrée, mécanique assez chiante dont je me débarrasserais volontiers ...

    j'aimerais qu'à la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    OCI_ExecuteStmt(st, "select * from client where prenom is ':prenom'");
    OCI_Bind ...
    on aurait un truc du genre ou approchant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    char req = "select * from client where prenom is 'Francis";
    OCI_ExecuteStmt(st, req);
    Le top pour ce débarrasser d'oci_bind serait de généré une requête de type const mtext * contenant directement les valeurs ... Est ce que seulement c'est possible ... ?

    PS : j'ai lu toute la doc de developpez.net concernant OCI_Lib que mon collègue m'a transmit sans trouver de vrai solution :

    http://vicenzo.developpez.com/tutoriels/c/ocilib/#LV-A

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    En gros, tu cherches à faire des "statements" et non des "prepared statements" ?

    En cherchant sur Google, je lis ca : http://orclib.sourceforge.net/documentation/
    OCI_ExecuteStmt(st, "select intcol, strcol from table");
    Il n'y a donc pas ici de paramétrer pour binder la requête.

    Sur ce même site, je lis par ailleurs qu'on peut faire des "formatted statements" ce qui ressemble fort à des "prepared statements": http://orclib.sourceforge.net/doc/ht...g__format.html
    Ton collègue fait deux appels mais pour moi, il ne devrait pas. Il devrait utiliser une requête formatée.

    De mémoire, les "prepared statements", avec le binding de la requête, n'est utile que si tu exécutes plusieurs fois la même requête mais avec des paramètres différents, pour gagner en vitesse. D'ailleurs, un petit tour sur Wiki me confirme ça : http://en.wikipedia.org/wiki/Prepared_statement Les "formated statements" ne sont peut-être qu'une facilité d'écriture sans forcément ouvrir de vraies "prepared statements", à vérifier.

    PS : un peu plus loin dans le tutoriel, on voit des requêtes non bindées.

    PS2 : t'as question était peut-être plus "comment générer la chaîne complète" ? La réponse est : avec sprintf() mais elle n'est disponible qu'en C99. Mais la requête formatée me parait plus adaptée.

    PS3 : http://vicenzo.developpez.com/tutoriels/c/ocilib/#LX-C

    PS4 : encore plus bas et toujours dans le même tuto, il est question des performances des requêtes formatées. A vérifier aussi. Le choix entre requête formatée et requête bindée manuellement (ou même encore de la chaine complète générée avec sprintf()) dépendra sûrement des opérations réalisées.

Discussions similaires

  1. [OCILIB] - Sélection en fonction de donnée optionelles
    Par enzo68290 dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 26/04/2013, 23h00
  2. [Crystal Reports] Sélection de Base de Données
    Par coucoucmoi dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 16/11/2004, 16h52
  3. affichage dynamique en fonction des données en base
    Par jengo dans le forum Bases de données
    Réponses: 1
    Dernier message: 28/10/2004, 10h22
  4. Ajusté les Axes d'un graphe en fonction des données rentrée!
    Par Ma2thieu dans le forum Composants VCL
    Réponses: 5
    Dernier message: 09/07/2004, 01h34
  5. [CR] mise en forme d'un champs texte en fonction des données
    Par niPrM dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 29/06/2004, 11h57

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