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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    Bonjour à tous

    J'ai crée dans un 1er temps une fonction en PL/SQL où j'utilise un curseur dans mon package que j'ai nommé pkg.

    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
    function p1 ( p1_id in number ) return varchar2
    is
    retour varchar2(2000);
    begin
    retour := null;
    BEGIN
      FOR c1 IN (SELECT apt.name
                 FROM AP_PAYMENT_SCHEDULES_ALL aps,
                      ap_invoices_all ai,
                      ap_suppliers ap,
                      ap_supplier_sites_all apsa,
                      ap_terms apt
                  WHERE apsa.vendor_site_id = p1_id
                  AND aps.invoice_id = ai.invoice_id
                  AND apt.term_id = ai.terms_id
                  AND ap.vendor_id = ai.vendor_id
                  AND apsa.vendor_site_id = ai.vendor_site_id
                  AND apsa.vendor_id = ap.vendor_id
                  AND apt.enabled_flag='Y')
      LOOP
        retour := retour || c1.name ;
      END LOOP;
    END;
     
    return retour;
     
    end;
    Ensuite, j'insère la valeur retournée par cette fonction dans une table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    insert into table_test ( 
    org_id,
    champ_test
    )
    select 
    org_id,
    pkg.p1(p1_id)
    from 
         ap_supplier_sites_all apsa;

    Le souci, c'est qu'au moment où j'insère, j'ai l'erreur suivante ORA-06502: PL/SQL: numeric or value error: character string buffer too small



    D'où ça peut venir ?
    J'ai pensé dans un premier temps que ça pouvait venir de retour varchar2(2000); dans mon fonction. (au départ c'était 80, j'ai mis 2000 et même essayé 4000) mais toujours le même souci.

    Aussi, ma table table_test possède 2 champs : org_id et champ_test.
    champ_test possède à la base un type VARCHAR2(80) que j'ai mis pour essayer à VARCHAR2(300) mais toujours le même souci également.

    Quelqu'un a déjà rencontré un souci de ce type ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 730
    Points : 29 110
    Points
    29 110
    Par défaut
    Avant de tester l'INSERT, as-tu essayé d'exécuter le SELECT pour vérifier la valeur retournée par la fonction ?
    Et la requête exécutée dans la fonction ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select 
    org_id,
    pkg.p1(p1_id)
    from 
         ap_supplier_sites_all apsa;

    Rien que ça me ramène l'erreur sous SQL Developer

    ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur: character string buffer too small
    ORA-06512: à "PKG", ligne 646
    06502. 00000 - "PL/SQL: numeric or value error%s"
    *Cause:
    *Action:

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    738
    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 : 738
    Points : 1 182
    Points
    1 182
    Par défaut
    Bonjour,

    Il vaut mieux éviter de faire des fonctions quand ce n'est pas utile, d'autant plus qu'ici la table qui sert à l'insertion est également utilisée dans la fonction, ce qui n'est pas terrible en termes de performance. Quand une fonction SQL est appelée au sein d'une requête, elle peut-être exécutée en interne plusieurs fois par Oracle, ce qui peut donc amener à l'erreur que tu rencontres puisque la fonction fait de la concaténation.
    Tu peux plutôt écrire ta requête ainsi:

    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
    INSERT INTO table_test(org_id, champ_test)
    SELECT apsa.org_id,
           LISTAGG(apt.name) WITHIN GROUP(ORDER BY null) 
    FROM AP_PAYMENT_SCHEDULES_ALL aps,
      ap_invoices_all ai,
      ap_suppliers ap,
      ap_supplier_sites_all apsa,
      ap_terms apt
    WHERE apsa.vendor_site_id = p1_id
    AND aps.invoice_id = ai.invoice_id
    AND apt.term_id = ai.terms_id
    AND ap.vendor_id = ai.vendor_id
    AND apsa.vendor_site_id = ai.vendor_site_id
    AND apsa.vendor_id = ap.vendor_id
    AND apt.enabled_flag='Y'
    GROUP BY apsa.org_id;

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    février 2018
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : février 2018
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    Merci

    Mais concrètement, c'est quoi le souci ? C'est ce que ramène ma fonction ? Elle ramène trop de valeurs ?

    Car le package se compile parfaitement au départ, donc ce n'est pas un souci syntaxique. C'est plutôt ce que ça ramène.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    décembre 2019
    Messages
    738
    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 : 738
    Points : 1 182
    Points
    1 182
    Par défaut
    Non ce n'est pas un souci de compilation. L'erreur vient du fait que l'appel de la fonction provoque un dépassement de la limite 4000 en sql. Tu peux essayer du "scalar subquery caching" en appelant ta fonction sous la forme de sous-requête scalaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select 
    org_id,
    (select pkg.p1(p1_id) from dual)
    from 
         ap_supplier_sites_all apsa;
    Mais le mieux c'est de faire comme j'ai indiqué.

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

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    juillet 2003
    Messages
    4 531
    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 531
    Points : 7 630
    Points
    7 630
    Billets dans le blog
    4
    Par défaut
    Ca vient de ton LOOP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      LOOP
        retour := retour || c1.name ;
      END LOOP;
    Tu ne testes pas la taille du champ, donc arrivé avec retour vers 2000 caractères, dès que tu vas concaténer et dépasser 2000.. erreur

    Soit tu tronques (mais le résultat n'est pas complet), soit tu sors en erreur.

    Exemple en tronquant le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE
    	v VARCHAR2(2000);
    BEGIN
    	FOR i IN 1..5000
      LOOP
      	v := SUBSTR(v || 'x', 1, 2000);
      END LOOP;
      DBMS_OUTPUT.put_line(LENGTH(v));
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/05/2018, 16h58
  2. Réponses: 0
    Dernier message: 29/01/2016, 18h43
  3. [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
  4. 'numeric or value error: number precision too large'
    Par sami117 dans le forum PL/SQL
    Réponses: 1
    Dernier message: 12/01/2009, 15h57
  5. Développement PL-SQL : Erreur ORA-06502
    Par sperronn dans le forum PL/SQL
    Réponses: 4
    Dernier message: 04/09/2008, 14h15

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