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 :

[10g][PL/SQL] Longueur d'un VARCHAR2


Sujet :

Oracle

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 125
    Points : 102
    Points
    102
    Par défaut [10g][PL/SQL] Longueur d'un VARCHAR2
    Bonjour,

    Comment déclarer un VARCHAR2 quand la longueur est passée en paramètre d'une fonction?
    Voici mon bout de code qui pose problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE OR REPLACE FUNCTION f_test (max NUMBER)
    RETURN VARCHAR2
    AS
         v_res VARCHAR2(max);
    ...
    Le VARCHAR2(max) est refusé puisqu'il faut une longueur constante.
    Comment faire pour déclarer mon VARCHAR2?

  2. #2
    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
    Déclarez sa valeur maximum autorisée, soit : 32767

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 125
    Points : 102
    Points
    102
    Par défaut
    Je croyais que c'était 4000 la longueur maximum?? :
    Mais ça ne va pas "bouffer" trop de mémoire si je fais comme ça?

  4. #4
    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
    La longueur maxi d'une colonne Varchar2() est 4000
    La longueur maxi d'une variable PL/SQL Varchar2() est 32767

    ce type d'objet ne prend que l'espace mémoire réellement occupé
    un varchar2 qui contient 'coucou' n'occupe que 6 octets en mémoire.

  5. #5
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Citation Envoyé par SheikYerbouti
    un varchar2 qui contient 'coucou' n'occupe que 6 octets en mémoire.
    tout à fait exact, mais attentention à ne pas généraliser trop vite, notamment si le CharacterSet est UTF8 par exemple.

    En effet, la particulartité de l'unicode est de pouvoir encoder tous types de caractères mais cela a un coût : l'encodage est de taille variable; tous les caractères dont le code est > 127 seront codés sur 2 octets ou plus, le premier bit indiquant la présence ou non d'un octet suivant (ceci concerne donc les accents, le grec, le russe, le chinois, ...)
    Ainsi, en UTF, "coucou" sera bien codé sur 6 octets mais "têtée" prendra 7 octets pour 5 caractères.

    Pour être complet sur le sujet, un VARCHAR2(5) signifie VARCHAR2 sur 5 octets maximum. Pour dire qu'il s'agit de 5 caractères maximum, il faut dire VARCHAR2(5 CHAR), sinon, c'est interprété comme VARCHAR2(5 BYTE)
    (ou de modifier la précision par défaut en jouant avec le paramètre d'initialisation nls_length_semantics)

  6. #6
    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
    Bien sûr. Il s'agissait simplement de rassurer en indiquant que la déclaration d'une variable de type Varchar2(32676) n'occuperait pas systématiquement toute cette place en mémoire...

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2003
    Messages
    125
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 125
    Points : 102
    Points
    102
    Par défaut
    Merci pour vos réponses!

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

Discussions similaires

  1. [10g][PL/SQL] To_date et date format
    Par gojira dans le forum SQL
    Réponses: 25
    Dernier message: 08/02/2008, 13h13
  2. [Oracle 9i/10g] PL/SQL
    Par Zay dans le forum PL/SQL
    Réponses: 6
    Dernier message: 28/12/2006, 17h41
  3. [10g][PL/SQL] exécuter la requete d'une fonction
    Par gojira dans le forum Oracle
    Réponses: 4
    Dernier message: 31/10/2006, 11h46
  4. Réponses: 1
    Dernier message: 17/03/2006, 07h21
  5. [10g] Documentation SQL et PL/SQL
    Par majid dans le forum PL/SQL
    Réponses: 2
    Dernier message: 09/03/2006, 17h41

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