IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces de programmation Oracle Discussion :

[OCI] export db avec champ long raw


Sujet :

Interfaces de programmation Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2
    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.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    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

Discussions similaires

  1. sauvegarder un text dans un champ Long raw oracle
    Par jeffray03 dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/11/2009, 12h02
  2. Réponses: 0
    Dernier message: 11/04/2008, 07h54
  3. Réponses: 1
    Dernier message: 14/05/2007, 21h36
  4. Réponses: 7
    Dernier message: 03/05/2007, 16h30
  5. [9.2] Champ long raw vers fichier
    Par Noun dans le forum Oracle
    Réponses: 4
    Dernier message: 23/11/2005, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo