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: PL/SQL : erreur numérique ou erreur sur une valeur: erreur de conversion des caractères en


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2020
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Erreur : ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur: erreur de conversion des caractères en
    Bonsoir,

    Je dois rendre un TP en PL/SQL et c'est la première fois que je m'essaie au langage d'Oracle.

    Avec le code de ma fonction suivant :

    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
    create or replace FUNCTION generer_prets (pnumsortie sortie.no_sortie%TYPE)
        RETURN NUMBER
        IS
            v_nopaq paquetage.no_paquetage%TYPE;
            v_caution paquetage.caution%TYPE; 
    BEGIN
        FOR enr IN (
            SELECT a.no_adherent, credits
            FROM adherent a
            INNER JOIN participe pa on a.no_adherent = pa.no_adherent
            WHERE pa.no_sortie = pnumsortie AND UPPER(payee) = 'V'
            FOR UPDATE OF credits)
            LOOP
                SELECT no_paquetage INTO v_nopaq
                FROM utilise u
                WHERE no_sortie = pnumsortie AND no_paquetage NOT IN(
                    SELECT no_paquetage
                    FROM pret
                    WHERE date_retour IS NULL)
                AND ROWNUM = 1;
                SELECT caution INTO v_caution
                FROM paquetage
                WHERE v_nopaq = no_paquetage;
                    IF v_caution < enr.credits THEN
                        INSERT INTO pret VALUES (SYSDATE, v_nopaq, enr.no_adherent, NULL);
                        UPDATE adherent SET credits = credits - v_caution WHERE no_adherent = enr.no_adherent;
                    ELSE
                    dbms_output.put_line('Problème de caution pour la paquetage ' + v_nopaq + ' et l''adhérent ' + enr.no_adherent);
                    END IF;
            END LOOP;
            COMMIT;
        RETURN (0);
    EXCEPTION
        WHEN NO_DATA_FOUND THEN dbms_output.put_line('Attention : plus de paquetage disponible');
        RETURN (-2);
     
        WHEN OTHERS THEN
            dbms_output.put_line('Erreur : ' || SQLERRM);
            RETURN (-1);
    END;
    J'obtiens le message suivant :
    Erreur : ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur: erreur de conversion des caractères en chiffres
    Est-ce que quelqu'un pourrait m'aiguiller svp ??

    Merci beaucoup d'avance !

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Bonjour,

    Quels sont les types de données des variables et colonnes impliquées dans la fonction? Enlève le dbms_output.put_line du bloc when others pour avoir le numéro de la ligne qui cause l'erreur.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Pour optimiser votre code, vous pouvez remplacer

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT no_paquetage INTO v_nopaq
                FROM utilise u
                WHERE no_sortie = pnumsortie AND no_paquetage NOT IN(
                    SELECT no_paquetage
                    FROM pret
                    WHERE date_retour IS NULL)

    par

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT no_paquetage INTO v_nopaq
    FROM utilise as UT
    WHERE UT.no_sortie = pnumsortie 
      AND not exists
         (select 1
          FROM pret as PR
          WHERE PR.date_retour IS NULL
            and PR.no_paquetage=UT.no_paquetage
         )

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbms_output.put_line('Problème de caution pour la paquetage ' + v_nopaq + ' et l''adhérent ' + enr.no_adherent)
    La concaténation en plsql est || (double pipe) et pas +

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbms_output.put_line('Problème de caution pour la paquetage ' || v_nopaq  || ' et l''adhérent ' ||enr.no_adherent)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2020
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour à tous,

    Je vous remercie pour vos réponses ! Le problème venait bien de la concaténation...

    Je place le sujet en résolu.

    Bonne continuation à vous

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

Discussions similaires

  1. Erreur ORA-06502: PL/SQL
    Par laure07 dans le forum Sql Developer
    Réponses: 6
    Dernier message: 03/02/2021, 10h09
  2. Réponses: 6
    Dernier message: 12/05/2020, 15h00
  3. Réponses: 5
    Dernier message: 24/04/2017, 14h57
  4. Réponses: 0
    Dernier message: 29/01/2016, 18h43
  5. [10g] ORA-06502: PL/SQL: numeric or value error: character to number conversion error
    Par MadoshiNatsu dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 10/05/2013, 18h45

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