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

SQL Oracle Discussion :

Passer des chaines de caractères très longues


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut Passer des chaines de caractères très longues
    Bonjour,

    J'ai une application qui tourne avec Oracle 10 XE + VB6.
    La connexion à la base se fait par le pilote ODBC d'Oracle (v10.2.0.1) et via ADO dans VB

    L'appli appelle une procédure d'un package avec plusieurs paramètres Varchar2 ou Number. Un des paramètres IN en Varchar2 pose problème. Je n'arrive pas à ce qu'il accepte une taille >=4000 caractères.

    Je ne comprends pas d'ou ça vient !!

    Je ne sais pas si c'est à cause de la procédure du package ! Il n'y a pas d'indication de taille dans la déclaration de la procédure. Quelle est la limite ?

    Je ne sais pas si c'est un problème des paramètres de l'ODBC ou de typage de la donnée dans VB !

    J'hésite à utiliser un Long dans la table Oracle car je ne sais pas ce que ca donne entre ODBC et VB6 !!

    Merci de votre aide

  2. #2
    Membre habitué
    Inscrit en
    Septembre 2006
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 142
    Points : 170
    Points
    170
    Par défaut
    La limite d'un varchar2 est 4000 octets (équivalent à 4000 caractères si tu n'es pas en UTF8)

    Utilise plutot le type CLOB pour stocké une chaine de caractères plus longue.

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Le problème n'est pas l'insertion des données dans Oracle
    J'insère n lignes de 4000 caractères pour tout insérer.

    Le problème est de réussir à passer plus de 4000 caractères à la proc à travers VB+ODBC

    La limite de 4000 du Varchar2 est-elle valable aussi pour un paramètre IN d'une proc ? (car on ne définit aucune taille dans ce cas là)

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2006
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 142
    Points : 170
    Points
    170
    Par défaut
    4000 octets est la limite du varchar2.

    Par contre il faudrais tester l'utilisation du type CLOB pour la variable d'entrée. Mais je ne sais ce que cela donne avec VB.

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    dans une fonction, procédure, la longueur maximale du varchar2 est du 32767

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    SCOTT@LSC01>  exec dbms_output.put_line(length(lpad('x',32767)));
    32767
     
    PL/SQL procedure successfully completed.
     
    SCOTT@LSC01>  exec dbms_output.put_line(length(lpad('x',32768)));
    BEGIN dbms_output.put_line(length(lpad('x',32768))); END;
     
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 1
    cependant, cela ne fonctionne qu'en pl/sql.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    SCOTT@LSC01> select length(lpad('x',32767)) from dual;
    LENGTH(LPAD('X',32767))
    -----------------------
                       4000
    comme suggéré, le type "clob" parait plus approprié

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Je ne comprends pas ! Je n'utilise pas directement SQL
    Le process étant STRING dans VB -> ODBC -> Package donc PL/SQL -> découpage des données en n fois 4000 pour insertion dans la table

    Il est possible de manipuler les données avec le CLOB ?

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Hobbi1
    Je ne comprends pas ! Je n'utilise pas directement SQL
    Le process étant STRING dans VB -> ODBC -> Package donc PL/SQL -> découpage des données en n fois 4000 pour insertion dans la table

    Il est possible de manipuler les données avec le CLOB ?

    pour VB->ODBC, je n'ai jamais fait, donc je ne peux pas te dire pourquoi la limite est 4000 et non 32768.

    Quant au CLOB, c'est très manipulable, par exemple avec le package DBMS_LOB ou alors avec les fonctions standard (LENGTH,REPLACE,SUBSTR).

    Jette éventuellement un oeil sur
    http://www.oracle.com/technology/sam.../odpbasic.html

    pour manipuler des clob avec ODP.NET

  8. #8
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Essayez de modifier seulement le type de variable de votre procedure stockée:

    avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_proc( p1 IN VARCHAR2, ... )
    apres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_proc( p1 IN CLOB, ... )

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci pour ces réponses ... mais ca marche toujours pas

    J'ai fait tout un tas de tests en modifiant la longueur du texte et/ou le type des données et échec !

    Ca marche quand la longueur de la String sous VB est <4000. Au dessus, ca ne passe pas.
    Etant donné que VB acccepte des chaines de 64Ko et qu'Oracle aussi par l'intermédiaire des CLOB, je pense donc qu'il s'agit du drvier ODBC, seul lien entre les 2
    J'utilise pourtant celui d'Oracle (v10.2.0.1).

    Quelqu'un peut m'aider ?

  10. #10
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Avez-vous tenté une recherche sur Google ?

  11. #11
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    En tous cas, voici un lien utile:
    http://download-east.oracle.com/docs...8/app_odbc.htm

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    il y a encore une autre limite, celle des "litterals".

    Tu ne peux avoir

    f('123456789.....10000')

    dans une fonction. tu dois passer par une variable

  13. #13
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Points : 130
    Points
    130
    Par défaut
    Merci pour toutes ces réponses.

    J'ai pas trouvé la solution miracle donc je découpe les données pour les envoyer et les insérer.

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

Discussions similaires

  1. [VB.NET]comment on filtre des chaines de caractères ?
    Par zouhib dans le forum Windows Forms
    Réponses: 61
    Dernier message: 14/06/2006, 15h33
  2. [C++.net]Concatener des chaines de caractère
    Par Dlyan dans le forum MFC
    Réponses: 3
    Dernier message: 27/03/2006, 16h25
  3. Repérer des chaines de caractères formatée dans du texte
    Par jeremiegrenoble dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 01/02/2006, 14h06
  4. Réponses: 15
    Dernier message: 23/01/2006, 05h35
  5. SQL String // Chaine de caractères trop longue
    Par Didier100 dans le forum Bases de données
    Réponses: 7
    Dernier message: 17/10/2005, 22h57

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