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 :

Problème de conversion hasardeuse ...


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 2
    Par défaut Problème de conversion hasardeuse ...
    Bonjour à tous

    J'utilise une fonction qui a pour rôle de :
    - convertir des caractères accentués en caractères normaux
    - transformer les minuscule en majuscule
    - supprimer des caractères interdit (genre '@' ...)

    Jusqu'à ce jour tout fonctionnait parfaitement jusqu'à ce que je change mon database character set ... en UNICODE.

    Mon moteur Oracle est une 9i r2 (9.2.0.7)
    Côté base de donnée :
    - NCHAR : AL16UTF16
    - CHAR : AL32UTF8
    Côté client oracle :
    - version 9.2.0.7
    - NLS_LANG= AMERICAN_AMERICA.WE8ISO8859P1

    Mon premier problème est que lorsque j'installe la fonction (exécution du script SQL pour compiler l'objet), j'ai des pertes des caractères accentués contenu dans le script !
    exemple :
    CONTENU DU FICHIER = V_STRING := TRANSLATE ( V_STRING, 'àâ', 'aa' );
    CONTENU DE LA BASE = V_STRING := TRANSLATE ( V_STRING, '┐┐', 'aa' );

    Une idée sur comment importer la chose ?

    Merci à vous...

    La fameuse fonction :
    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
    43
    44
    45
    46
     
    FUNCTION FCT_TRT_E( X_STRING IN VARCHAR2 ) RETURN VARCHAR2 IS
    	V_STRING 	VARCHAR2(255);
    	V_STRING1 	VARCHAR2(255);
    	V_STRING2 	VARCHAR2(2);
    	V_LEN		NUMBER;
    	V_NUM		NUMBER;
    	V_NUM2		NUMBER;
    BEGIN
    	V_STRING := X_STRING;
     
    	-- Libelle
    	V_STRING := TRANSLATE ( V_STRING, 'àâ', 'aa' );
    	V_STRING := TRANSLATE ( V_STRING, 'ç', 'c' );
    	V_STRING := TRANSLATE ( V_STRING, 'éèêë', 'eeee' );
    	V_STRING := TRANSLATE ( V_STRING, 'ïî', 'ii' );
    	V_STRING := TRANSLATE ( V_STRING, 'ô', 'o' );
    	V_STRING := TRANSLATE ( V_STRING, 'ùû', 'uu' );
    	V_STRING := REPLACE( V_STRING, CHR(13), ' ' );
    	V_STRING := REPLACE( V_STRING, CHR(10), ' ' );
     
    	V_STRING := UPPER( V_STRING );
    	V_STRING1 := '';
    	IF ( V_STRING IS NOT NULL ) THEN
    		V_LEN 	 := LENGTH( V_STRING );
    		V_NUM 	 := 1;
    		<<boucle1>>
    		LOOP
    		-- FOR V_NUM IN 1..V_LEN LOOP
    			IF V_NUM > V_LEN THEN
    				exit boucle1;
    			END IF;
    			V_STRING2 := substr( V_STRING, V_NUM, 1 );
    			V_NUM2 := ascii( V_STRING2);
    			IF ( ( V_NUM2 > 38 and V_NUM2 < 64 ) or ( V_NUM2 > 64 and V_NUM2 < 94 ) ) THEN
    				V_STRING1 := V_STRING1 || V_STRING2;
    			ELSE
    				V_STRING1 := V_STRING1 || ' ';
    			END IF;
    			V_NUM := V_NUM +1;
    		END LOOP boucle1;
    		V_STRING := V_STRING1;
    	END IF;
     
    	return V_STRING ;
    END FCT_TRT_E;

  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
    Je n'arrive pas à reproduire votre problème d'affichage avec Oracle 10.2.0.10, Windows XP et sqlplusw.exe:

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    SQL> 
    SQL> column parameter format a30
    SQL> column value format a30
    SQL> 
    SQL> select * from nls_database_parameters;
    
    PARAMETER                      VALUE                                            
    ------------------------------ ------------------------------                   
    NLS_LANGUAGE                   AMERICAN                                         
    NLS_TERRITORY                  AMERICA                                          
    NLS_CURRENCY                   $                                                
    NLS_ISO_CURRENCY               AMERICA                                          
    NLS_NUMERIC_CHARACTERS         .,                                               
    NLS_CHARACTERSET               AL32UTF8                                         
    NLS_CALENDAR                   GREGORIAN                                        
    NLS_DATE_FORMAT                dd/mm/yyyy                                       
    NLS_DATE_LANGUAGE              AMERICAN                                         
    NLS_SORT                       BINARY                                           
    NLS_TIME_FORMAT                HH.MI.SSXFF AM                                   
    
    PARAMETER                      VALUE                                            
    ------------------------------ ------------------------------                   
    NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM                         
    NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR                               
    NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR                     
    NLS_DUAL_CURRENCY              $                                                
    NLS_COMP                       BINARY                                           
    NLS_LENGTH_SEMANTICS           CHAR                                             
    NLS_NCHAR_CONV_EXCP            FALSE                                            
    NLS_NCHAR_CHARACTERSET         UTF8                                             
    NLS_RDBMS_VERSION              10.2.0.1.0                                       
    
    20 rows selected.
    
    SQL> 
    SQL> select * from nls_session_parameters;
    
    PARAMETER                      VALUE                                            
    ------------------------------ ------------------------------                   
    NLS_LANGUAGE                   AMERICAN                                         
    NLS_TERRITORY                  AMERICA                                          
    NLS_CURRENCY                   $                                                
    NLS_ISO_CURRENCY               AMERICA                                          
    NLS_NUMERIC_CHARACTERS         .,                                               
    NLS_CALENDAR                   GREGORIAN                                        
    NLS_DATE_FORMAT                DD-MON-RR                                        
    NLS_DATE_LANGUAGE              AMERICAN                                         
    NLS_SORT                       BINARY                                           
    NLS_TIME_FORMAT                HH.MI.SSXFF AM                                   
    NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM                         
    
    PARAMETER                      VALUE                                            
    ------------------------------ ------------------------------                   
    NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR                               
    NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR                     
    NLS_DUAL_CURRENCY              $                                                
    NLS_COMP                       BINARY                                           
    NLS_LENGTH_SEMANTICS           CHAR                                             
    NLS_NCHAR_CONV_EXCP            FALSE                                            
    
    17 rows selected.
    
    SQL> 
    SQL> @[.%NLS_LANG%]
    SP2-0310: unable to open file "[.AMERICAN_AMERICA.WE8ISO8859P1]"
    SQL> select sys_context('USERENV', 'LANGUAGE') from dual;
    
    SYS_CONTEXT('USERENV','LANGUAGE')                                               
    --------------------------------------------------------------------------------
    AMERICAN_AMERICA.AL32UTF8                                                       
    
    SQL> 
    SQL> declare
      2  v_string VARCHAR2(30) := 'àâ';
      3  begin
      4  null;
      5  end;
      6  /
    
    PL/SQL procedure successfully completed.
    
    SQL> show errors
    No errors.
    SQL> exit

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 2
    Par défaut
    Merci de votre réponse,

    En fait il ne s'agit pas d'une erreur lorsque je compile la fonction, mais plutôt de la façon dont est stockée la fonction.

    Lorsque j'utilise un outils type TOAD ou RAPTOR, et que je visionne la fonction, il se trouve que les caractères accentués ont disparus.

    De plus, lorsque j'exécute la fonction, elle ne me convertie pas les caractères accentués ...
    Donc, au final, lorsque je passe dans la boucle (voir mon extrait de code dans la LOOP), les caractères accentués sont supprimés.

    HAL777

  4. #4
    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
    C'est bien ce que j'avais compris

    Etes-vous sûr que le NLS_LANG utilisé par TOAD ou RAPTOR est correct ?
    Si vous exécutez mon script dans votre environnement, que donne-t-il ?

    Si vous avez un doute sur le stockage d'une donnée caractère, utilisez
    la fonction DUMP sur la colonne qui donnera la représentation binaire du caractère dans le jeu de la base.

    Exemple:
    select dump(text) from user_source where name = 'FCT_TRT_E' and text like '%TRANSLATE%' order by line;

Discussions similaires

  1. problème de conversion de dimension dans BUSINESS OBJECT
    Par greatmaster1971 dans le forum Deski
    Réponses: 4
    Dernier message: 28/04/2014, 13h15
  2. - [CAST ou CONVERT] Problème de conversion de date
    Par Boublou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2004, 14h31
  3. Problème de conversion 3DS->.X
    Par JBernn dans le forum DirectX
    Réponses: 5
    Dernier message: 08/04/2004, 19h08
  4. Problème de conversion unicode
    Par djmalo dans le forum C
    Réponses: 5
    Dernier message: 09/03/2004, 11h48
  5. Réponses: 11
    Dernier message: 02/09/2003, 14h20

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