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, je suis obliger de bind en fonction des mêmes données, et le type attendu pour la requête est de type " 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 = ':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 = '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