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

PL/SQL Oracle Discussion :

Extraire requete SQL en CSV mais colonne BLOB [11gR2]


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Points : 119
    Points
    119
    Par défaut Extraire requete SQL en CSV mais colonne BLOB
    Bonjour;

    Je dois créer un fichier à plat type CSV ou autre généré à partir d'une requête SQL.
    Hors cette requête SQL renvoie des BLOB...
    Je suis limité par le spooling et le parametre "lines". J'ai des gros BLOB (désolé)

    Je dois faire cela car ma boite à fait affaire avec une startup dédiée au BigData et donc il faut aucune perte de cohérence lors de mes extract de Prod et surtout avoir le contenu des BLOB/CLOB pour qu'ils puissent faire des etudes BigData etc...

    Merci de bien vouloir partager vos connaissances.
    AD

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Blob dans un CSV ça ne fera pas l'affaire!
    Demandez à la boite en question comment veut-elle de traiter ce cas.
    Sinon extrayez le contenu de la table dans un csv et le contenu des blob dans des fichiers sur disque en s'imaginant que vous avez toujours les infos pour dire quel fichier blob appartient à quel clé primaire de la table.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Points : 119
    Points
    119
    Par défaut
    Bonjour mnitu et merci de votre réponse;
    La base source à partir de laquelle je fais les extracts fait 2To.
    J'ai essayé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    declare
     
    fextract utl_file.file_type;
     
    vblob blob;
     
    vclob clob;
     
    begin
     
    fextract := utl_file.fopen('EXTRACT_DIR','FILENAME_EXTRACT.dsv','w',32760);
     
     
     
    for c in (SELECT col1, nummer_txtCpteRendu , coln FROM tab1, ... ,tabn  WHERE cond1...condn GROUP BY ... ORDER BY .. )  loop
     
     
     
    select xxxblockedxxx into vblob
     
    from feldmemo
     
    where nummer = c.nummer_txtCpteRendu ;
     
     
     
    vclob:=xxx.Base64Encode(vblob);
     
    utl_file.put_line(fextract,c.col1||'|'||vclob||'|'||c.coln);
     
     
     
    end loop;
     
    utl_file.fclose(fextract);
     
    end;
     
    /
    MAis j'avais omis que le blob pouvait etre null donc j'ai eu cette erreur :
    ORA-06512: à ligne 540

    01403. 00000 - "no data found"

    *Cause: No data was found from the objects.

    *Action: There was no data from the objects which may be due to end of fetch.

    Je compte la contrôler via la modif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if ( vblob is null ) then
    utl_file.put_line(fextract,c.Cle_CRH||'BLOB txtCpteRendu est NULL'||c.Type_sejour);
    else
    vclob:=LVALAT_RO.Base64Encode(vblob);
    utl_file.put_line(fextract,c.Cle_CRH||'|'||vclob||'|'||c.Type_sejour); 
    end if;
    UTL_FILE a quand même extrait 3/4 blobs mais bon je ne comprends pas très bien l'encodage :
    $wc -l FILENAME_EXTRACT.dsv.0

    107564 FILENAME_EXTRACT.dsv.0

    $head -c4096 FILENAME_EXTRACT.dsv.0

    311905364|AQBdCwEAVQtDaGVyIENvbmZy6HJlLA0NTm91cyBhdm9ucyByZXZ1IGVuIGhvc3Bp

    dGFsaXNhdGlvbiBkZSBqb3VyIGxlIDIxLzA2LzIwMTcsIFxtMWwnZW5mYW50IElz

    c2EgQUFCSVpBLCBu6SBsZSAxNi8wOC8yMDE0ICjiZ+kgZGUgMyBhbnMpIFxtMHBv

    dXIgc3VpdmkgZCd1bmUgbWFsYWRpZSBkZSBy6XRlbnRpb24gZGVzIGNoeWxvbWlj

    cm9ucyUgc2Fu

    Z3VpbiBub3JtYWwsIA0tIGZvbmN0aW9uIHLpbmFsZSBub3JtYWxlLCANLSBiaWxh

    biBwaG9zcGhvY2FsY2lxdWUgbm9ybWFsLCANLSBiaWxhbiBo6XBhdGlxdWUgYXZl

    YyBUR08gbm9ybWFsIOAgNjYgVS9sIChOIDwgNzEpLCBUR1AgYXVnbWVudOkg4CA1

    OCBVL2wgKE48NDApLCBHYW1tYSBHVCAxNCBVL2wgKE4gPDg3KSwgcGhvc3BoYXRh

    c2VzIGFsY2FsaW5lcyAxNzYgVS9sLC

    b2wvbCwgDS0gYmlsYW4gbWFydGlhbCBhdmVjIHVuIGZlciBz6XJpcXVlIOAgNy42

    ILVtb2wvbCwgZmVycml0aW5lIDE2LjYgtWcvbCwgY29lZmZpY2llbnQgZGUgZml4

    YXRpb24gYWJhaXNz6SDgIDguOSAlLiANLSBiaWxhbiBsaXBpZGlxdWUgYXZlYyBj

    aG9sZXN06XJvbCB0b3RhbCDpZ2FsIOAgMC41NiBnL2wsIEhETCAwLjEzIGcvbCwg

    TERMIDAuMjYgZy9sLCBWTERMIDAuMTcgZy9sLCBUcmlnbHlj6XJpZGVzIDAuODYg

    Zy9sLiANQXBvbGlwb3Byb3TpaW5lIEExIGFiYWlzc+llIOAgMC41NSBnL2wsIEFw

    by4gQiBs6WfocmVtZW50IGFiYWlzc+kg4CAwLjQyIGcvbA0tIExQYSBub3JtYWxl

    IOAgMC4xMyBnL2wuIA0tIE5GUyA6IEhiIDExLjEgZy9kbCwgVkdNIDcxLjEgtTMs

    IHBsYXF1ZXR0ZXMgMzg3IDAwMC9tbTMsIGxldWNvY3l0ZXMgMTAgMjAwL21tMyBh

    dmVjIHVuZSBmb3JtdWxlIGxldWNvY3l0YWlyZSBub3JtYWxlLiBiaWxhbiBkJ2jp

    bW9zdGFzZSBhdmVjIHVuIFRQIOAgODEgJSwgZmlicmlub2fobmUgMi4xIGcvbCAo

    TiksIA0tIDI1IE9IIEQzIG5vcm1hbCDgIDU1IG5nL21sDS0gYmlsYW4gdml0YW1p

    bmlxdWUgYXZlYyBDUlAsIG9yb3NvbXVjb+9kZSBub3JtYXV4LCBhbGJ1bWluZSA0

    MSBnL2wsIHppbmMgc+lyaXF1ZSBub3JtYWwg4CAxMi44NSC1bW9sL2wgYXZlYyB1

    biB6aW5jIOlyeXRocm9jeXRhaXJlIGzpZ+hyZW1lbnQgYWJhaXNz6SDgIDEyMC4x

    ILVtb2wvbCwgc+ls6W5pdW0gY29ycmVjdCwgVml0YW1pbmUgQSBs6WfocmVtZW50

    IGF1Z21lbnTpZSDgIDAuNDggbWcvbCwgdml0YW1pbmUgRSBub3JtYWxlIOAgNS40

    NiBtZy9sLg0NQXUgbml2ZWF1IGRlcyBhY2lkZXMgZ3Jhcywgb24gcmV0cm91dmUg

    dW4gZOlmaWNpdCBlbiBhY2lkZSBsaW5vbOlpcXVlLiANDVxtMUFVIFRPVEFMIDog

    bCfpdm9sdXRpb24g6XRhaXQgY29ycmVjdGUuIE5vdXMgYXZvbnMgcHLpdnUgZCdh

    dWdtZW50ZXIgbGVzIHF1YW50aXTpcyBkZSBNb25vZ2VuIOAgNjAwIG1sL2pvdXIu

    IE5vdXMgYXZvbnMg6WdhbGVtZW50IGF1Z21lbnTpIGxhIHN1cHBs6W1lbnRhdGlv

    biBlbiBIdWlsZSBkZSBUQ00g4CAxMCBtbCB4IDIgcGFyIGpvdXIuIFxtMA0NTGUg

    cmVzdGUgZGUgbGEgcHJlc2NyaXB0aW9uIGVzdCBpbmNoYW5n6S4NDUplIHNvdWhh

    aXRlcmFpcyByZXZvaXIgSXNzYSBlbiBjb25zdWx0YXRpb24gZGFucyA2IG1vaXMN

    DQ1KZSB2b3VzIGFkcmVzc2UgbWVzIHNhbHV0YXRpb25zIGRpc3Rpbmd16WVzDQ0N

    XG04XGY6MTIwNTFcSW5mb3JtYXRpb24gOiBMZXMgZGlmZulyZW50cyBjb3Vycmll

    cnMgZGUgdm9zIHBhdGllbnRzLCBob3NwaXRhbGlzYXRpb24gY29tbWUgY29uc3Vs

    dGF0aW9uLCBwZXV2ZW50IHZvdXMg6nRyZSBhZHJlc3PpcyBwYXIgbWFpbCBz6WN1

    cmlz6S4gQ2VsYSBhIGwnYXZhbnRhZ2UgZGUgbGEgcmFwaWRpdOkgbWFpcyBhdXNz

    aSBkZSBsJ2FyY2hpdmFnZSBwdWlzcXUnaWwgc2VyYSBiZWF1Y291cCBwbHVzIHNp

    bXBsZSBwb3VyIHZvdXMgZGUgY29uc2VydmVyIGNlcyBkaWZm6XJlbnRzIGNvdXJy

    aWVycyBzdXIgdm90cmUgb3JkaW5hdGV1ci4gUG91ciBi6W7pZmljaWVyIGRlIGNl

    IHNlcnZpY2UgZ3JhdHVpdCwgdW5lIHNpbXBsZSBpbnNjcmlwdGlvbiBzdWZmaXQg

    c3VyICJtZWRpbWFpbC5taXBpaC5mciIuXG0wXGY6MjAwNFwgXGY6MTIwNTFcXG04

    RmFpdGVzIGxlIGNob2l4IGRlIGxhIGTpbWF06XJpYWxpc2F0aW9uIHRvdGFsZS4g

    Q29jaGV6IGxhIGNhc2UgcHLpdnVlIGRhbnMgbGVzIHBhcmFt6HRyZXMgZGUgdm90

    cmUgY29tcHRlIE1lZGltYWlsLg1cbTBcZjotXAA=|stationär

    311888936|AQB2CgEAbgpDaGVyIENvbmZy6HJlLA0NTm91cyBhdm9ucyB2dSBlbiBob3NwaXRh

    [etc...]

    "
    Je suis sous AIX7.1 64bits
    $echo $NLS_LANG

    american_america.WE8ISO8859P15
    Lorsque j'ouvre une session sqlplus / as sysdba :

    SQL> select * from v$nls_parameters;



    PARAMETER VALUE

    ---------------------------------------------------------------- ----------------------------------------------------------------

    NLS_LANGUAGE AMERICAN

    NLS_TERRITORY AMERICA

    NLS_CURRENCY $

    NLS_ISO_CURRENCY AMERICA

    NLS_NUMERIC_CHARACTERS .,

    NLS_CALENDAR GREGORIAN

    NLS_DATE_FORMAT DD-MON-RR

    NLS_DATE_LANGUAGE AMERICAN

    NLS_CHARACTERSET UTF8

    NLS_SORT BINARY

    NLS_TIME_FORMAT HH.MI.SSXFF AM

    NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM

    NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR

    NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR

    NLS_DUAL_CURRENCY $

    NLS_NCHAR_CHARACTERSET UTF8

    NLS_COMP BINARY

    NLS_LENGTH_SEMANTICS BYTE

    NLS_NCHAR_CONV_EXCP FALSE



    J'oubliais la fonction base64encode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create or replace function           Base64Encode(pBlob in blob) return clob is
          vClob clob;
          vStep pls_integer := 12000; -- a multiple of 3 not higher than 24573
        begin
          DBMS_LOB.CreateTemporary(vClob, True, DBMS_LOB.CALL);
          for i in 0..trunc((dbms_lob.getlength(pBlob) - 1 ) / vStep)
          loop
            vClob := vClob || utl_raw.cast_to_varchar2(utl_encode.base64_encode(dbms_lob.substr(pBlob, vStep, i * vStep + 1)));
          end loop;
          return vClob;
        end;

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Points : 119
    Points
    119
    Par défaut
    a rajouter bloc BEGIN EXCEPTION END; dans la boucle loop

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete SQL calcule sur les colonnes
    Par rose-rose dans le forum SQL Procédural
    Réponses: 10
    Dernier message: 19/05/2011, 09h47
  2. requete sql pour sommer des colonnes
    Par debutsas dans le forum SAS Base
    Réponses: 109
    Dernier message: 22/04/2011, 12h26
  3. [Requete SQL] Choix de la colonne selon case
    Par catchouse dans le forum Développement
    Réponses: 8
    Dernier message: 08/05/2009, 20h04
  4. requete SQL pour nom de colonne de mes tables..
    Par dutty76 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/03/2008, 11h06
  5. [SQL] Requete SQL mal formée : mais je vois pas pourquoi !
    Par Thomus38 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/06/2006, 18h03

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