|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : septembre 2006 Messages : 2 ![]() |
Bonjour,
Je dois faire un programme C utilisant OCI qui fait l'exportation d'une db vers un fichier texte ainsi que le fichier ctl pour l'utiliser avec sqlldr après. Mon souci concerne un champ de type long raw. Voici le describe de ma table: A NOT NULL NUMBER(20) B NOT NULL LONG RAW 1) Tout d'abord, pour l'exportation de la db dans le fichier texte, les champs de type long raw dans le fichier texte doivent être en hexadécimal (genre le fichier serait "999|626f6e6a6f7572") ou plutôt "999|bonjour". Je suppose que '|' est le séparateur défini dans le fichier ctl. 2) i=0; while (i < nbrcolonne) { ... field[i] = (char *) malloc(200 * nombre_de_lignes); define[i]=(OCIDefine *) malloc(sizeof(OCIDefine *)); // si c'est un long raw: c = OCIDefineByPos(stmt, &define[i], err, (ub4) i + 1, (dvoid *) field[i], (sb4) 200, SQLT_LBI, (dvoid *) &indicator[i], (ub2 *) size[i], (ub2 *) 0, OCI_DEFAULT); ... } c = OCIStmtExecute(svcd, stmt, err, (ub4) 1, (ub4) 0, (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, (ub4) OCI_DEFAULT); Avec ce bout de code, ça fonctionne mais on remarque que j'ai mis 200 en dur dans le code. Comment connaître la valeur qu'il faut y mettre pour la taille de ce champ long raw ? Au début, j'avais fait un describe de la table (via des appels OCI) et je récupérais la taille avec OCIAttrGet avec comme paramètre OCI_ATTR_DATA_SIZE. Ca fonctionne pour tout sauf pour long raw qui me renvoie la valeur 0, du coup j'avais tout le temps "ORA-01406: fetched column value was truncated". J'ai aussi lu qu'il y avait moyen d'avoir cette taille allouée automatiquement en utilisant le paramètre OCI_DYNAMIC_FETCH. Savez-vous comment l'utiliser (si c'est la bonne voie) ? Un grand merci pour toute aide. |
|
|
00
|
|
|
#2 |
|
Membre confirmé
![]() Inscription : janvier 2006 Messages : 178 ![]() |
Je n'ai jamais travaillé avec le type LONG. Ce type va être abandonné : veillez à changer de type dans la nouvelle base de données, si possible (passer à un BLOB). De plus, peu de fonctions sont compatibles avec les LONG ou LONG RAW, et je n'en voit aucune permettant d'en récupérer la taille
Ce que je sais en revanche, c'est que le type LONG RAW autorise une taille maximum de 2 Go, donc 200 octets me semblent peu Bon courage, rbaraer |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com