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 @@.
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.
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> |
SQL> SELECT * 2 FROM nls_instance_parameters 3 WHERE parameter in ('NLS_LANGUAGE','NLS_TERRITORY'); PARAMETER VALUE ------------------------------ ----------------- NLS_LANGUAGE FRENCH NLS_TERRITORY FRANCE SQL> |
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> |
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.
SQL> INSERT INTO table_accent 2 VALUES('Test éphémère SQL*PLUS.','Défaut NLS_LANG','INSERT STATEMENT'); 1 ligne crÚÚe. |
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 |
C:\>SET NLS_LANG=.WE8MSWIN1252 C:\>SQLPLUS scott/tiger@dbtest SQL> @c:\accent.sql SQL> exit |
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.
| 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 |