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 :

erreur ora-06502 dans procédure stockée


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 65
    Points : 30
    Points
    30
    Par défaut erreur ora-06502 dans procédure stockée
    Bonjour,

    ça va bientôt faire 1 journée que je planche sur ce pb sans résultat, alors... à votre bon coeur SVP !

    La procédure suivante (je l'ai simplifiée pour l'exemple) :
    CREATE OR REPLACE PROCEDURE PRCTEST (
    COMMENTAIRE OUT MATABLE.MATABLE_COMMENT%TYPE)
    AS
    CURSOR c1 IS
    SELECT MATABLE_COMMENT
    FROM MATABLE
    WHERE MATABLE_CLE = 85967
    FOR UPDATE OF MATABLE_ETAT;
    BEGIN
    OPEN c1;
    FETCH c1 INTO COMMENTAIRE;
    IF c1%FOUND
    THEN
    UPDATE MATABLE SET MATABLE_ETAT = 'T' WHERE CURRENT OF c1;
    COMMIT;
    END IF;
    CLOSE c1;
    END;
    déclenche une erreur sur la ligne du Fetch lorsque le champ MATABLE_COMMENT contient plus de 250 caractères (en l'occurrence, il en contient 330). Voici le message d'erreur :
    ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur: tampon de chaîne de caractères trop petit
    ORA-06512: à "USER_OWNER_GC.PRCTEST", ligne 11
    ORA-06512: à ligne 7

    Or, voici la déclaration de ce champ :
    MATABLE_COMMENT VARCHAR2(2000),

    Sachant que la syntaxe
    COMMENTAIRE OUT VARCHAR2(500)
    est refusée,
    et que la syntaxe
    COMMENTAIRE OUT VARCHAR2
    donne le même résultat (erreur 06502), que pourrais-je essayer ?

    Le contenu du champ qui fait planter (au cas où...) :
    LISTEIDTRM:FE0500041210042007161711106:33,FE0500041210042007161819591:33,FE0500041210042007163827347:33,FE0500041210042007163900221:33,FE0500041210042007165019599:33,FE0500041210042007165125082:33,FE0500041213042007094137902:33,FE0500041213042007094321745:33,FE0500041213042007094430641:33,FE0500041213042007094514592:33;LISTEIDMSG:;

    Dès que je mets moins de 256 caractères dans ce champ, la PS ne se plante plus...

    Je précise que je suis plutôt novice en ce qui concerne Oracle, que la base doit être une base Oracle 8i (pas certain. Si c'est important, je me renseignerai).

    Merci pour toute aide, je craque un peu...

  2. #2
    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
    Comment appelles-tu ta procédure ? Quelle est la taille de la variable qui reçoit le paramètre commentaire ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 65
    Points : 30
    Points
    30
    Par défaut
    dans la réalité, via un programme Delphi, composant TStoredProc et dans une variable de type String (dataType = ftString), donc pas de pb pour moi de ce côté-là.
    Mais pour l'exemple, ça se plante aussi via TOAD.
    Ce n'est pas une exception remontée par Delphi, mais bien par Oracle.

  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
    Que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare 
      v_comment varchar2(4000);
    begin
      PRCTEST (v_comment);
    end;
    /
    et que donne :
    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
    CREATE OR REPLACE PROCEDURE PRCTEST (
    COMMENTAIRE OUT MATABLE.MATABLE_COMMENT%TYPE)
    AS
    CURSOR c1 IS
    SELECT MATABLE_COMMENT
    FROM MATABLE
    WHERE MATABLE_CLE = 85967
    FOR UPDATE OF MATABLE_ETAT;
      v_comment varchar2(4000);
    BEGIN
    OPEN c1;
    FETCH c1 INTO v_comment;
    IF c1%FOUND
    THEN
    UPDATE MATABLE SET MATABLE_ETAT = 'T' WHERE CURRENT OF c1;
    COMMIT;
    END IF;
    CLOSE c1;
      commentaire := v_comment;
    END;

  5. #5
    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
    Pour orienter ta recherche :
    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
    SQL> create or replace procedure p1 (v out varchar2) is
      2  begin
      3    v := 'aa';
      4  end;
      5  /
    Procedure created.
     
    SQL> variable v1 varchar2(1);
     
    SQL> execute p1 (:v1)
    BEGIN p1 (:v1); END;
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at "USER1.P1", line 3
    ORA-06512: at line 1
     
    SQL> variable v1 varchar2(2);
     
    SQL> execute p1 (:v1)
    PL/SQL procedure successfully completed.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 65
    Points : 30
    Points
    30
    Par défaut
    1er test :

    SQL> variable v_comment varchar2(2000)
    SQL> execute prctest(:v_comment)

    Procédure PL/SQL terminée avec succès.

    OK, je vois bien le principe : la déclaration supplante celle de la PS et tout baigne. Mais comment faire via mon prog ? Outre le fait que je voudrais vraiment ne pas avoir à toucher au code Delphi, je ne vois pas comment récupérer les valeurs retournées...

    2ème test :
    déclarer une variable Varchar2(2000) pour faire le FETCH...INTO : ok, ça roule, mais comment retourner cette valeur ?

    Au fait, merci beaucoup pour ton aide !

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 65
    Points : 30
    Points
    30
    Par défaut
    et j'oubliais : pour toi, c'est un bug ? C'est lié à une version d'Oracle ?

  8. #8
    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
    Citation Envoyé par zorino
    et j'oubliais : pour toi, c'est un bug ? C'est lié à une version d'Oracle ?
    Non pour moi cela vient que ta variable d'affectation n'est pas assez grande. Je ne connais pas delphi, mais peut-être que le type de la variable dans laquelle tu récupères la valeur est limité à 256 caractères.

    En PL/SQL tu n'auras pas d'erreur non plus si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare 
      v_comment MATABLE.MATABLE_COMMENT%TYPE;
    begin
      PRCTEST (v_comment);
    end;
    /
    Pour moi c'est vraiment la variable qui réceptionne ton paramètre out qui pose problème => le problème n'est sans doute pas lié à oracle.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 65
    Points : 30
    Points
    30
    Par défaut
    ok, merci encore, je vais fouiner du côté de Delphi...

Discussions similaires

  1. ORA-00942 dans procédure stockée
    Par rachadj dans le forum Oracle
    Réponses: 1
    Dernier message: 13/06/2011, 20h08
  2. erreur ORA-01722 dans une procédure
    Par Lolitaaa dans le forum PL/SQL
    Réponses: 10
    Dernier message: 26/06/2009, 15h01
  3. Erreur ORA-4030 dans Procédure PL/SQL
    Par nicolas.dron dans le forum PL/SQL
    Réponses: 7
    Dernier message: 09/01/2009, 18h07
  4. Réponses: 3
    Dernier message: 21/10/2006, 22h46

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