Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Interfaces de programmation
Interfaces de programmation Forum d'entraide sur l'utilisation des API Oracle : Pré-compilateurs, OCI, OCCI, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/09/2007, 09h18   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2004
Messages : 84
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 84
Points : 11
Points : 11
Par défaut [OCI] une erreur dans l'execution pour cette requete SQL

Bonjour, le code suivant fonctionne pour cette requete SQL :

Code :
SELECT nom FROM client WHERE code=:cd
mais si je change le requete par :
Code :
SELECT nom,prenom FROM client WHERE code=:cd
ça fonctionne pas

ci-dessous tout le code source

Code :
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
 
 
#include "stdafx.h"
#include <conio.h>
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>
 
static OCIEnv           *p_env;
static OCIError         *p_err;
static OCISvcCtx        *p_svc;
static OCIStmt          *p_sql;
static OCIDefine        *p_dfn    = (OCIDefine *) 0;
static OCIBind          *p_bnd    = (OCIBind *) 0;
 
 
void _tmain(int argc, _TCHAR* argv[])
{
   int             p_bvi;
   char            p_sli[20];
   int             rc;
   char            errbuf[100];
   int             errcode;
 
   rc = OCIInitialize((ub4) OCI_DEFAULT, (dvoid *)0,  // Initialize OCI
           (dvoid * (*)(dvoid *, size_t)) 0,
           (dvoid * (*)(dvoid *, dvoid *, size_t))0,
           (void (*)(dvoid *, dvoid *)) 0 );
 
   // Initialize evironment
   rc = OCIEnvInit( (OCIEnv **) &p_env, OCI_DEFAULT, (size_t) 0, (dvoid **) 0 );
 
   // Initialize handles
   rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_err, OCI_HTYPE_ERROR,
           (size_t) 0, (dvoid **) 0);
   rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_svc, OCI_HTYPE_SVCCTX,
           (size_t) 0, (dvoid **) 0);
 
   // Connect TO DATABASE server
   rc = OCILogon(p_env, p_err, &p_svc, (OraText *) "test", 4, (OraText *)"test", 4, (OraText *)"DBV8", 4);
   IF (rc != 0) {
      OCIErrorGet((dvoid *)p_err, (ub4) 1, (text *) NULL, &errcode, (OraText *) errbuf, (ub4) sizeof(errbuf), OCI_HTYPE_ERROR);
      printf("Error - %.*sn", 512, errbuf);
      exit(8);
   }
 
   /* Allocate and prepare SQL statement */
   rc = OCIHandleAlloc( (dvoid *) p_env, (dvoid **) &p_sql,
           OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0);
   rc = OCIStmtPrepare(p_sql, p_err, (OraText *) "select nom,prenom from client where code=:cd",
           (ub4) 37, (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);
 
   /* Bind the values for the bind variables */
   p_bvi = 1;     /* Use DEPTNO=10 */
   rc = OCIBindByName(p_sql, &p_bnd, p_err, (text *) ":cd",
           -1, (dvoid *) &p_bvi, sizeof(int), SQLT_INT, (dvoid *) 0,
           (ub2 *) 0, (ub2 *) 0, (ub4) 0, (ub4 *) 0, OCI_DEFAULT);
	//printf("rc = %d",rc);
   // Define the SELECT list items
   rc = OCIDefineByPos(p_sql, &p_dfn, p_err, 1, (dvoid *) &p_sli,
           (sword) 20, SQLT_STR, (dvoid *) 0, (ub2 *)0,
           (ub2 *)0, OCI_DEFAULT);
 
   // Execute the SQL statment
   rc = OCIStmtExecute(p_svc, p_sql, p_err, (ub4) 1, (ub4) 0,
           (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_DEFAULT);
 
   while (rc != OCI_NO_DATA) {             // Fetch the remaining DATA
      printf("\n%s",p_sli);
      rc = OCIStmtFetch(p_sql, p_err, 1, 0, 0);
   }
 
   rc = OCILogoff(p_svc, p_err);                           // Disconnect
   rc = OCIHandleFree((dvoid *) p_sql, OCI_HTYPE_STMT);    // Free handles
   rc = OCIHandleFree((dvoid *) p_svc, OCI_HTYPE_SVCCTX);
   rc = OCIHandleFree((dvoid *) p_err, OCI_HTYPE_ERROR);
 
   getch();
}
Bien à vous

Abdelkaoui
Abdelkaoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 12h12   #2
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
C'est normal !!

"select nom prenom...." retourne 1 élement qui la concaténation des deux champs donc, 1 out buffer à définir..

"select nom, prenom...." retourne 2 élements donc, 2 out buffers à définir..

Il faut donc faire deux appels à OCIDefineByPo()....
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 12h29   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2004
Messages : 84
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 84
Points : 11
Points : 11
en fait le probleme reside dans l'ajout de la clause WHERE. autrement dit, cette requete fonctionne bien :
Code :
SELECT nom,prenom FROM client
mais lorsqu'on ajoute la condition:
Code :
SELECT nom,prenom FROM client WHERE code=:c
ça ne fonctionne plus

Bien à vous

Abdelkaoui
Abdelkaoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h51.


 
 
 
 
Partenaires

Hébergement Web