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 :

[8.1.7] ORA-06502 - variable chaîne trop petite !?


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut [8.1.7] ORA-06502 - variable chaîne trop petite !?
    Je suis en train d'écrire un trigger en PL/SQL sous Oracle 8.1.7.
    Je construis une requête que je stocke dans une variable VARCHAR2 de taille 32 767 (le maximum, apparement).

    J'obtiens l'erreur suivante :
    Citation Envoyé par Erreur SQL
    ORA-06502: PL/SQL: numeric or value error ORA-06512 ...
    Je suppose que ca veut dire que ca ne rentre pas (trop de caractères).

    Voici la première partie (qui fonctionne). Je la mets juste pour montrer comment je rempli les 2 variables DmlStr1 et DmlStr2 :
    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
    41
    42
       DmlStr VARCHAR2(32767);
       DmlStr1 VARCHAR2(15000);
       DmlStr2 VARCHAR2(15000);
       PremierChamp NUMBER;
     
       -- Recherche de la liste des champs de la table DOSSIER.
       Cursor CurListeChampsDossier is
       select COLUMN_NAME from sys.all_tab_columns
       where TABLE_NAME = 'DOSSIER'
       and COLUMN_NAME <> 'NUM_CC';
       CurEnrListeChampsDossier CurListeChampsDossier%ROWTYPE;
     
    begin
     
    ...
     
             PremierChamp := 1;
             DmlStr1 := 'select ';
             DmlStr2 := '   (select ';
     
             -- Parcours des champs de la table DOSSIER.
             OPEN CurListeChampsDossier;
             begin
                LOOP
                   FETCH CurListeChampsDossier into CurEnrListeChampsDossier;
                   EXIT WHEN CurListeChampsDossier%NOTFOUND;
     
                   if(PremierChamp = 1) then
                      DmlStr1 := DmlStr1 || ' decode(T1.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 0, T2.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 1)';
                      DmlStr2 := DmlStr2 || ' decode(DOSSIER.' || CurEnrListeChampsDossier.COLUMN_NAME || ', HIST_DOSSIER.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 0, 1) as ' || CurEnrListeChampsDossier.COLUMN_NAME;
                      PremierChamp := 0;
                   else
                      DmlStr1 := DmlStr1 || ', decode(T1.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 0, T2.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 1)';
                      DmlStr2 := DmlStr2 || ', decode(DOSSIER.' || CurEnrListeChampsDossier.COLUMN_NAME || ', HIST_DOSSIER.' || CurEnrListeChampsDossier.COLUMN_NAME || ', 0, 1) as ' || CurEnrListeChampsDossier.COLUMN_NAME;
                   end if;               
                END LOOP;
                CLOSE CurListeChampsDossier;
             exception
                when OTHERS then
                   CLOSE CurListeChampsDossier;
                   raise_application_error(-20008, 'Erreur curseur CurListeChampsDossier (' || CurEnrListeChampsDossier.COLUMN_NAME || ' - ' || length(DmlStr1) || ' - ' || length(DmlStr2) || '): ' || SQLERRM);
             end;
    Et voici la partie qui pose problème, parce que j'essais de stocker plus de 34 040 caractères dans la variable DmlStr :
    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
             -- Ajout de la ligne de modification.
             begin
                DmlStr := 'insert into HIST_MODIF_DOSSIER (';
                DmlStr := DmlStr || DmlStr1 || ' from';
                DmlStr := DmlStr || DmlStr2;
                DmlStr := DmlStr || ' from DOSSIER, HIST_DOSSIER';
                DmlStr := DmlStr || ' where DOSSIER.NUM_CC = ' || :NEW.NUM_CC;
                DmlStr := DmlStr || ' and DOSSIER.NUM_CC = HIST_DOSSIER.NUM_CC';
                DmlStr := DmlStr || ' and ID_HIST_DOSSIER = (select max(ID_HIST_DOSSIER) from HIST_DOSSIER where NUM_CC = ' || :NEW.NUM_CC || ')) T1';
                DmlStr := DmlStr || ', ';
                DmlStr := DmlStr || DmlStr2;
                DmlStr := DmlStr || ' from DOSSIER, HIST_DOSSIER';
                DmlStr := DmlStr || ' where DOSSIER.NUM_CC = ' || :NEW.NUM_CC;
                DmlStr := DmlStr || ' and DOSSIER.NUM_CC = HIST_DOSSIER.NUM_CC';
                DmlStr := DmlStr || ' and ID_HIST_DOSSIER = 1) T2';
                DmlStr := DmlStr || ' )';
                execute immediate DmlStr;
             exception
                when OTHERS then
                   raise_application_error(-20009, 'Erreur ajout HIST_MODIF_DOSSIER (UPDATING):  [' || length(DmlStr) || ' - ' || (length(DmlStr1) + length(DmlStr2) + length(DmlStr2)) || ']  ' || SQLERRM);
             end;
          end if;
    Ma question est donc :
    Que puis-je utiliser comme type chaîne plus grand pour stocker ma requête ?
    Je suis preneur de toute idée ...

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    J'ai peur qu'il n'y a pas vraiment de solution car EXECUTE IMMEDIATE a besoin d'un VARCHAR2: on ne peut pas passer un CLOB qui lui n'est pas limité à 32K mais EXECUTE IMMEDIATE refuse un CLOB et si on convertit un CLOB plus grand que 32K en VARCHAR2 on a le même problème ...

  3. #3
    Expert confirmé
    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
    Par défaut
    J'y crois pas ! quelle requête peut bien nécessiter plus de 34000 caractères ?!

  4. #4
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Citation Envoyé par pifor
    J'ai peur qu'il n'y a pas vraiment de solution car EXECUTE IMMEDIATE a besoin d'un VARCHAR2: on ne peut pas passer un CLOB qui lui n'est pas limité à 32K mais EXECUTE IMMEDIATE refuse un CLOB et si on convertit un CLOB plus grand que 32K en VARCHAR2 on a le même problème ...
    Bon, bin faut que je cherche à faire autrement, alors ...


    Citation Envoyé par SheikYerbouti
    J'y crois pas ! quelle requête peut bien nécessiter plus de 34000 caractères ?!
    Un insert de select de decode de 43 champs de 2 select de decode de 43 champs chacun.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

Discussions similaires

  1. ORA-06502 parametre de sortie pose probleme
    Par Mons dans le forum SQL
    Réponses: 33
    Dernier message: 12/05/2009, 15h37
  2. Réponses: 1
    Dernier message: 18/03/2009, 17h17
  3. Frm-40735 / Ora-06502
    Par Tarik79 dans le forum Forms
    Réponses: 3
    Dernier message: 03/10/2006, 12h17
  4. [SQL] Problème d'affichage de caractère spéciaux dans une variable chaîne
    Par Kryptonaute dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/08/2006, 08h40
  5. ORA-06502 sur un delete
    Par DBS dans le forum Oracle
    Réponses: 61
    Dernier message: 01/04/2005, 16h01

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