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 18/09/2006, 14h43   #1
Invité de passage
 
Inscription : septembre 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 2
Points : 0
Points : 0
Par défaut [OCI] export db avec champ long raw

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.
atuan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2006, 15h24   #2
Membre confirmé
 
Inscription : janvier 2006
Messages : 178
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : janvier 2006
Messages : 178
Points : 208
Points : 208
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
rbaraer 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 08h31.


 
 
 
 
Partenaires

Hébergement Web