Samedi 16 juillet 2011 6 16 /07 /Juil /2011 20:05

 

Insérer et lire les accents sous SQLPLUS avec SET NLS_LANG.

Comment insérer et lire des accents sous SQL*PLUS DOS. ?
Comment changer le paramètre NLS_LANG. ?

Le sujet lié au NLS_LANG et aux problèmes d'accents est vaste, c'est pourquoi je ne rentrerai pas dans les détails.
Le but de cet article est simplement de vous montrer les erreurs à ne pas commettre pour une gestion sans problèmes des accents sous SQL*PLUS lors INSERT STATEMENT ou SELECT ou d’exécution de script avec la commande SQLPLUS @ et @@ appelant des fichiers type NOTEPAD, WORDPAD.

En effet la même requête INSERT INTO avec accents n'aura pas le même SET NLS_LANG, suivant qu'on l’exécute directement dans SQLPLUS ou par appel de script avec @ et @@.

Syntaxe SET NLS_LANG.

 
NLS_LANG [clients Language]_[clients Territory].[clients characterset]
 
SET NLS_LANG=FRENCH_FRANCE.WE8MSWIN1252
 
SET NLS_LANG=_FRANCE.WE8MSWIN1252
 
SET NLS_LANG=.WE8MSWIN1252

Voici la config NLS de mon environnement de test.

NLS DATABASE PARAMETERS.

 
SQL> SELECT *
  2  FROM   nls_database_parameters
  3  WHERE  parameter in ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');

PARAMETER                      VALUE
------------------------------ ----------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CHARACTERSET               WE8MSWIN1252

SQL>

 

NLS INSTANCE PARAMETERS.

 
SQL> SELECT *
  2  FROM   nls_instance_parameters
  3  WHERE  parameter in ('NLS_LANGUAGE','NLS_TERRITORY');

PARAMETER                      VALUE
------------------------------ -----------------
NLS_LANGUAGE                   FRENCH
NLS_TERRITORY                  FRANCE

SQL>

 

NLS SESSION PARAMETERS.

 
SQL> SELECT *
  2   FROM   nls_session_parameters
  3   WHERE  parameter in ('NLS_LANGUAGE','NLS_TERRITORY');

PARAMETER                      VALUE
------------------------------ ---------------
NLS_LANGUAGE                   FRENCH
NLS_TERRITORY                  FRANCE


SQL> SELECT sys_context('userenv','language') FROM dual;

SYS_CONTEXT('USERENV','LANGUAGE')
----------------------------------
FRENCH_FRANCE.WE8MSWIN1252

SQL>

 

LISTER PARAMETRE NLS DATABASE, INSTANCE, SESSION.

 
SQL> SET linesize 120
SQL> COLUMN PARAMETERS FORMAT A25
SQL> COLUMN "DATABASE PARAMETERS" FORMAT A28
SQL> COLUMN "INSTANCE PARAMETERS" FORMAT A21
SQL> COLUMN "SESSION PARAMETERS" FORMAT A26
SQL>
SQL> SELECT
  2     data.parameter "PARAMETERS",
  3     data.value "DATABASE PARAMETERS",
  4     inst.value "INSTANCE PARAMETERS",
  5     sess.value "SESSION PARAMETERS"
  6  FROM
  7     nls_database_parameters data LEFT OUTER JOIN nls_instance_parameters inst
  8                                               ON(data.parameter = inst.parameter)
  9                                  LEFT OUTER JOIN nls_session_parameters sess
 10                                               ON(data.parameter = sess.parameter)
 11  ORDER BY 1;

PARAMETERS                DATABASE PARAMETERS          INSTANCE PARAMETERS   SESSION PARAMETERS
------------------------- ---------------------------- --------------------- --------------------------
NLS_CALENDAR              GREGORIAN                                          GREGORIAN
NLS_CHARACTERSET          WE8MSWIN1252
NLS_COMP                  BINARY                                             BINARY
NLS_CURRENCY              $                                                  ¦
NLS_DATE_FORMAT           DD-MON-RR                                          DD/MM/YYYY
NLS_DATE_LANGUAGE         AMERICAN                                           FRENCH
NLS_DUAL_CURRENCY         $                                                  ¦
NLS_ISO_CURRENCY          AMERICA                                            FRANCE
NLS_LANGUAGE              AMERICAN                     FRENCH                FRENCH
NLS_LENGTH_SEMANTICS      BYTE                         BYTE                  BYTE
NLS_NCHAR_CHARACTERSET    AL16UTF16
NLS_NCHAR_CONV_EXCP       FALSE                        FALSE                 FALSE
NLS_NUMERIC_CHARACTERS    .,                                                 ,
NLS_RDBMS_VERSION         10.2.0.1.0
NLS_SORT                  BINARY                                             FRENCH
NLS_TERRITORY             AMERICA                      FRANCE                FRANCE
NLS_TIME_FORMAT           HH.MI.SSXFF AM                                     HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT      DD-MON-RR HH.MI.SSXFF AM                           DD/MM/RR HH24:MI:SSXFF
NLS_TIMESTAMP_TZ_FORMAT   DD-MON-RR HH.MI.SSXFF AM TZR                       DD/MM/RR HH24:MI:SSXFF TZR
NLS_TIME_TZ_FORMAT        HH.MI.SSXFF AM TZR                                 HH24:MI:SSXFF TZR

20 ligne(s) sélectionnée(s).

SQL>

Si ils sont définis, les paramètres du client NLS_SESSION_PARAMETERS ont toujours préséance sur NLS_INSTANCE_PARAMETERS et NLS_DATABASE_PARAMETERS. Sous Windows, vous avez deux options possibles, normalement le NLS_LANG est défini dans la base de registre, mais il peut également être défini dans une variable d'environnement. La variable d'environnement l'emporte sur la valeur définie dans la base de registre et est utilisée pour tous les Oracle Homes du serveur si elle est définie comme une variable d'environnement système.
Le jeu de caractères du client est défini par le NLS_LANG sur l'OS client.

 

Démo INSERT STATEMENT avec ACCENT dans SQL*PLUS.

 
SQL> INSERT INTO table_accent
  2         VALUES('Test éphémère SQL*PLUS.','Défaut NLS_LANG','INSERT STATEMENT');

1 ligne crÚÚe.

 

Démo INSERT STATEMENT et appel Script avec SET NLS_LANG=.WE8PC850 dans SQL*PLUS.

 
C:\>SET NLS_LANG=.WE8PC850
C:\>SQLPLUS scott/tiger@dbtest

SQL> INSERT INTO table_accent
  2         VALUES('Test éphémère SQL*PLUS.','NLS_LANG=.WE8PC850','INSERT STATEMENT');

1 row created.

SQL> @c:\accent.sql

 

Démo @SCRIPT INSERT STATEMENT SET NLS_LANG=.WE8MSWIN1252 dans SQL*PLUS.

 
C:\>SET NLS_LANG=.WE8MSWIN1252
C:\>SQLPLUS scott/tiger@dbtest

SQL> @c:\accent.sql
SQL> exit

 

Voyons le résultat dans SQL*PLUS.

 
C:\>SET NLS_LANG=.WE8PC850
C:\>SQLPLUS scott/tiger@dbtest
SQL> SET linesize 120
SQL> SELECT * FROM table_accent;

TEXT                           NLS_LANG                                     QUOI
------------------------------ -------------------------------------------- -----------------
Test ■ph■m■re SQL*PLUS.        D■faut NLS_LANG                              INSERT STATEMENT
Test éphémère SQL*PLUS.        NLS_LANG=.WE8PC850                           INSERT STATEMENT
Test éphémère SQL*PLUS.        NLS_LANG=.WE8MSWIN1252                       Appel Script @
Test ■ph■m■re SQL*PLUS.        NLS_LANG=.WE8MSWIN1252                       INSERT STATEMENT
Test ÚphÚmÞre SQL*PLUS.        NLS_LANG=.WE8PC850                           Appel Script @
Test éphémère TOAD.            NLS_LANG=.WE8MSWIN1252                       INSERT STATEMENT

6 rows selected.

SQL>

En conclusion, on s'aperçoit qu'il faut initialiser la variable NLS_LANG du Client à :

SET NLS_LANG=.WE8PC850 pour inserer des accents dans SQL*PLUS DOS.
SET NLS_LANG=.WE8MSWIN1252 pour inserer des accents via appel de script ( @ / @@) dans SQL*PLUS.

Haut de Page www.dba-ora.fr

 

Liens en rapport avec l'article et qui sont susceptibles de vous intéresser
• Creer un Rapport HTML avec SQLPLUS
• Liste Description Commandes SQLPLUS
• Liste Description SQLPLUS SET SYSTEM VARIABLE
Par Daniel Roesch - Publié dans : SQLPLUS
Ecrire un commentaire - Voir les 0 commentaires
Retour à l'accueil

Rechercher Articles Oracle SQL sur ce Site.

Loading

À lire aussi…

Download PDF Oracle

Rechercher sur le site

Oracle 10G - DBA -

Syndication

  • Flux RSS des articles
Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus - Articles les plus commentés