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

Oracle Discussion :

Problème taille chaine


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 54
    Points : 46
    Points
    46
    Par défaut Problème taille chaine
    Bonjour,

    Je cherche à extraire les données d'une table (base Oracle version 8 )dans un fichier spool (via un PL/SQL)

    Mon fichier ressemble à ceci :
    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
    set heading off 
    set feedback off  
    set pagesize 0  
    set linesize 5200  
    set verify off
    set newpage 0 
    set space 0 
    spool monfichierspool
    SELECT  
    1||
    ltrim(to_char(champ1,'000000000000000'))||
    nvl(ltrim(to_char(champ2,'000000000000000')),'               ')||      
    [...] ||
     rpad(champ48,4000) 
    FROM 
    matable; 
    spool off
    Bien qu'ayant un champ de 4000 caractères (chaque ligne fait 5200 caractères) , si je limite mon extraction à 30 lignes je n'ai pas de problème, mon fichier spool contient bien toutes mes lignes.
    Au delà de 30 lignes extraites (je n'ai pas fait le test pour savoir exactement à partir de combien ça plantait) , j'obtiens l'erreur oracle suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-01489: result of string concatenation is too long
    Quelle est la limite pour le résultat d'une requete oracle (si c'est bien de là que vient le problème) ?
    Comment puis-je contourner ce problème ?

    Merci

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 54
    Points : 46
    Points
    46
    Par défaut
    Merci pour le lien mais une chose m'échappe quand même :

    the max length of a varchar2 is 4000 characters in 8.x (2000 in 7.x). A string
    concatenation is a varchar2 -- hence, the max you can concat is 4000 bytes.
    Si mon problème est le même, cela devrait planter dès la première ligne.. et pas au delà des 30 lignes extraites , non ?

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Es-tu sûr que tes 30 premières lignes comportent plus de 4000 caractères et que ce n'est pas seulement la 31è qui dépasse cette longueur ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 54
    Points : 46
    Points
    46
    Par défaut
    Oui il me semble que mes lignes font bien plus que 4000 caractères puisque j'utilise la fonction RPAD.

    A moins que je me trompe cette fonction "Retourne la chaîne de caractères complétée à droite par le motif précisé (ou par défaut un espace)" non ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 54
    Points : 46
    Points
    46
    Par défaut
    Je viens de voir qu'en fait RPAD ne fonctionne pas tout à fait comme je pensais ..
    RPAD(chaine, longueur[, motif])
    Cette fonction COMPLETE la chaine avec un motif sur un certain nombre de caractère, mais si la chaine de départ est vide .. aucun caractère n'est ajouté.
    Il se pourrait bien que mon problème vienne de là ..

  7. #7
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    Nous fesons des exports et nous avons arrêté de faire ca avec les spools, trop contraignant.
    1-obligation de ||
    2-obligation d'avoir le résultat dans select unique
    3-formatage de sql*Plus obligatoire...

    Utilise ult_file exemple :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    spool monfichierspool
    prompt Extraction
    DECLARE 
     wobs              traitement.obs3%type;      -- Observation
       wout              utl_file.file_type;        -- type de fichier genere
       wrep_fic          varchar2(100)   := null;  -- repertoire d'ecriture
       wnom_fic          varchar2(100)   := null;   -- fichier d'ecriture
       wligne            varchar2(250);
     
       cursor c_lst is 
          SELECT 1||
                 ltrim(to_char(champ1,'000000000000000'))||
                 nvl(ltrim(to_char(champ2,'000000000000000')),'               ')|| 
                 [...] ||
                 rpad(champ48,4000) 
          FROM 
          matable; 
     
     
     BEGIN
       -- Definition des parametres du fichier   
       wrep_fic := '/folder';
       wnom_fic := 'exp.dat';
     
       wobs := 'Ouverture du fichier.doc';
       wout := utl_file.fopen(wrep_fic, wnom_fic, 'w');   
     
       wobs := 'Compose Entete';
       wligne := 'col1,col2.....';
     
       wobs := 'Ecriture entete dans fichier';
       utl_file.put_line(wout,wligne);   
       for r_lt in c_lst loop
     
          wobs := 'Compose Ligne';
          wligne := r_lt.col1||';'||r_lt.col2||';'||....;
     
          wobs := 'Ecriture Ligne';
          utl_file.put_line(wout,wligne);
       end loop;
       wobs := 'Fermeture du fichier';
       -- si le fichier est ouvert, on le ferme
          if utl_file.is_open(wout) = TRUE then
                utl_file.fclose(wout) ;
          end if ;
    EXCEPTION
       when utl_file.invalid_operation then
          -- si le fichier est ouvert, on le ferme
          if utl_file.is_open(wout) = TRUE then
                utl_file.fclose(wout) ;
          end if ;
     
          raise_application_error(-20001,'ERREUR1:'|| sqlerrm||wobs);
       when utl_file.invalid_filehandle then
          -- si le fichier est ouvert, on le ferme
          if utl_file.is_open(wout) = TRUE then
                utl_file.fclose(wout) ;
          end if ;
     
          raise_application_error(-20001,'ERREUR2:'|| sqlerrm||wobs);
     
       when utl_file.write_error then
          -- si le fichier est ouvert, on le ferme
          if utl_file.is_open(wout) = TRUE then
                utl_file.fclose(wout) ;
          end if ;
     
          raise_application_error(-20001,'ERREUR3:'|| sqlerrm||wobs);
     
       when others then
          -- si le fichier est ouvert, on le ferme
          if utl_file.is_open(wout) = TRUE then
                utl_file.fclose(wout) ;
          end if ;
     
          raise_application_error(-20001,'ERREUR4:'|| sqlerrm||wobs);
    END;
    /
    show err
    spool off
    Ceci est un rapide copier/coller de code à toi de le faire l'adapter.

Discussions similaires

  1. taille chaine avec pointeur
    Par africanwinners dans le forum Débuter
    Réponses: 2
    Dernier message: 31/08/2011, 15h35
  2. Réponses: 10
    Dernier message: 15/03/2005, 10h31
  3. [langage] taille chaine de caracteres
    Par katikats dans le forum Langage
    Réponses: 8
    Dernier message: 10/01/2005, 11h06
  4. Réponses: 10
    Dernier message: 22/05/2004, 13h51
  5. Taille de chaines de caractere et \0
    Par KORTA dans le forum C
    Réponses: 16
    Dernier message: 05/09/2003, 09h28

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