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.
Partager