|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 421 ![]() |
bonjour,
voila, je dois d'utiliser la librairie OCI (et non OCIlib malheureusement) pour realiser une requete du type select * from table1. Tout ce passe bien jusqu'a ce que j'essaie de recuperer la premiere ligne. j'ai fait un OCIPrepare , suivi d'un OCI execute, jusque la tout va bien. le probleme c'est pour recuperer le resultat. Si j'ai bien compris (la doc etant pas tres clair la dessus), je recuperer d'abord le nombre de colonne que la reponse contient, suivi du type de chaque colonne puis je fais un OCIDefine, puis un fetch pour recuperer chaque ligne. la ou cela coince, c'est pour recuperer le type et faire l'appel du define. dans le define il faut faudra dire de quelle type sera la case. Soit SQLT_INT soit SQLT_STR; or quand je fait type == SQLT_INT ou type == SQLT_STR tout les deux sont faut. Comment savoir de quelle type sont les réponses? merci a++ |
|
|
00
|
|
|
#2 |
![]() ![]() vincent rogier Inscription : juillet 2007 Messages : 2 355 ![]() |
Poste ton code ! Comment tu as recupéré le type ? Il faut savoir que OCI ne te fournira jamais SQLT_INT quand tu décris une colonne.. Il te fournira dans 99 % cas SQLT_NUM pour la famille des number qui regoupre quasiment tous les numériques sauf les FLOAT (double, float, real, ..) En fait SQLT_INT est utilisé quant tu appelles OCIDefine(). Résumons, tu as une colonnes de type sql INT (qui est en fait un NUMBER). Tu décris la colonne et tu obtiens SQL_NUM. SI tu veux récupérer la valeur sous forme de int en C , tu passes SQLT_INT pour définir la colonne et Oracle fera la conversion et mettra dans ton buffer des int... Bon, je ne suis peut être pas très clair (j'ai faim... faut aller bouffer..). Tu peux regarder le source d'OCILIB pour apprendre comment fonctionne OCI. N'hésites pas, je suis à ta disposition.
__________________
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 |
|
00
|
|
|
#3 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 421 ![]() |
bonjour et merci.
Le truc c'est que j'ai pas le code ici (je l'ai oublié. je le mettrais demain matin) pourquoi pas ocilib, c'est assez compliquer mais en gros on peut pas (malheureusement). en fait, je dois faire une espece de portage dans un language totalement exotique etc... Peut etre par la suite pourquoi pas...mais c'est pas moi le patron merci pour tout en cas. |
|
|
00
|
|
|
#4 | ||||||||||
|
Membre habitué
![]() Inscription : avril 2004 Messages : 421 ![]() |
bonjour, voila quoi ressemble plus ou moins mon code (j'ai omis tout l'indispensable)
j'essaie de recuperer la commande sqlsuivante 'SELECT * FROM "table3"' pour cela Code :
puis je l'execute Code :
Code :
Code :
et c'est la que j'ai un probleme car je dois savoir le type Code :
ce qui fait que c'est un SQLT_CLOB or normalement cela doit etre un char... bizarre, en plus,cela me vaut une belle erreur Fetch - ORA-00932: inconsistent datatypes: expected NUMBER got DTY0 mis bon, ca c'est pas pour tout de suite. salutation et merci pour tout. a++ |
||||||||||
|
|
00
|
|
|
#5 | ||
![]() ![]() vincent rogier Inscription : juillet 2007 Messages : 2 355 ![]() |
Déja tu pourrais aussi poster le DDL de la table
De même que Oracle ne renverra jamais SQLT_INT pour un number même entier (car SQLT_INT ne sert que dans l'autre sens, c'est à dire pour lui inqiuer que son number, tu veux le récuperer dans un int), SQLT_STR ne te sera jamais renvoyé par ORACLE... C'est en général un type que tu fournit à OCIDefine() pour qu'il te renvoi le buffer (char, varchar, ...) sous forme de chaines C à zéro terminal. Donc, pour résumer :
col->ocode est le code SQLT_XXX récupéré d'Oracle col->icode est le code SQLT_XXX qui sera fournit à OCIDefine() 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 |
||
|
00
|
|
|
#6 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 421 ![]() |
wouahh... merci pour tout.
je regarderais cela demain a mon aise. a++ et encore merci |
|
|
00
|
|
|
#7 | ||||
|
Membre habitué
![]() Inscription : avril 2004 Messages : 421 ![]() |
salut,
premierement merci pour tout mais il y a un truc que je comprend pas. voila comment je creer une mini base sql. Code :
et toi pour faire la difference, tu fais le code suivant Code :
salutation merci a++ |
||||
|
|
00
|
|
|
#8 | ||
![]() ![]() vincent rogier Inscription : juillet 2007 Messages : 2 355 ![]() |
il faut que tu récupère l'attribut precision et scale de ta colonne
Code :
le test que tu mentionnes détermine que la colonne est de type entier sans valeurs décimale si le scale = 0 et que la precision est comprise entre entre 1 et 38. Sinon, c'est du double ! C'est comme ca...
__________________
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 |
||
|
00
|
|
|
#9 |
|
Membre habitué
![]() Inscription : avril 2004 Messages : 421 ![]() |
merci
a++ |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com