Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/12/2010, 12h16   #1
Invité de passage
 
Inscription : février 2007
Messages : 32
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 32
Points : 4
Points : 4
Par défaut Erreur ORA 06502 sur fonction

Bonjour à tous,

J'ai créé une fonction pour adapter l'algorithme du soundex au français sous Oracle 10g.
J'applique cette fonction sur un champ nom. Je mets à jour ce champs avec l'instruction :

Code :
UPDATE asg SET nom= soundex_fr(nom)

Cette fonction fonctionne bien sur trois tables et sur des champs différents mais sur une table, elle me génère une erreur ORA 06502. Je ne comprends pas trop les champs sont du meme type que pour les autres tables. En revanche la volumétrie est plus importante.

Voici le code me procédure :
Code :
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
CREATE OR REPLACE FUNCTION soundex_fr( p_string IN varchar2 ) RETURN varchar2
deterministic
AS
  l_return_string varchar2(6) DEFAULT substr( p_string, 1, 1 );
  l_char      varchar2(1);
  l_last_digit    number DEFAULT 0;
  type vcArray IS TABLE of varchar2(10) INDEX BY binary_integer;
  l_code_table    vcArray;
begin
 
  l_code_table(1) := 'BP';
  l_code_table(2) := 'CKQ';
  l_code_table(3) := 'DT';
  l_code_table(4) := 'L';
  l_code_table(5) := 'MN';
  l_code_table(6) := 'R';
  l_code_table(7) := 'G,J';
  l_code_table(8) := 'XZS';
  l_code_table(9) := 'FV';
  FOR i IN 1 .. length(p_string)
  loop
    exit when (length(l_return_string) = 6);
    l_char := upper(substr( p_string, i, 1 ) );
    FOR j IN 1 .. l_code_table.count
    loop
      IF (instr(l_code_table(j), l_char ) > 0 AND j <> l_last_digit)
      then
        l_return_string := l_return_string || to_char(j,'fm9');
        l_last_digit := j;
      end IF;
    end loop;
  end loop;
  RETURN rpad( l_return_string, 6, '0' );
end;
Et voici l'erreur générée:

Erreur commençant à la ligne 1 de la commande :
update asg set nom= soundex_fr(nom)
Rapport d'erreur :
Citation:
Erreur SQL : ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur: tampon de chaîne de caractères trop petit
ORA-06512: à "PERF_AS.SOUNDEX_FR", ligne 23
06502. 00000 - "PL/SQL: numeric or value error%s"
*Cause:
*Action:
Quelqu'un aurait une idée??
khomar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2010, 12h25   #2
Invité de passage
 
Inscription : février 2007
Messages : 32
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 32
Points : 4
Points : 4
J'ai oublié de préciser que lorsque je fais

Code :
SELECT soundex_fr(nom) FROM asg
j'obtient les bons résultats
khomar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 16h15   #3
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

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

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
Bonjour,

A mon avis la colonne nom a une valeur nulle dans certain cas ...
Si vous passez la commande suivante cela fonctionne-t-il ?
Code :
1
2
 
UPDATE asg SET nom= soundex_fr(nom) WHERE nom IS NOT NULL;
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h02.


 
 
 
 
Partenaires

Hébergement Web