Проблеми виникають при використанні в oracle 11g на windows - dmitry bobrovsky blogdmitry

Починаючи з версії Oracle 11.1 GUI утиліта sqlplusw.exe оголошена як застаріла (deprecated) і виключена зі складу дистрибутива. Тепер доводиться використовувати тільки консольную версію - sqlplus.exe. При її використанні, з російською мовою, виникають проблеми. Повідомлення самої sqlplus і повідомлення виводяться скриптами (це різні речі) відображаються не коректно (крякозябри або символами псевдографіки). Ще, деякі стали задавати питання, як встановити робочу папку щоб виконувалися вкладені скрипти. Розберемося по порядку:

Проблеми некоректних повідомлень виникають через те що консоль за замовчуванням виводить все в кодуванні OEM DOS 866. а скрипти це зазвичай текстові файли в кодуванні MS WIN 1251. Кодування повідомлень sqlplus залежить від змінної NLS_LANG, а тому бази з даними російською мовою зазвичай створюються в кодуванні CL8MSWIN1251 (НЕ RU8PC866), то і змінні NLS_LANG встановлюються відповідно як CL8MSWIN1251. Тобто проблема через розбіжності кодувань консолі і програм, які виводять повідомлення на консоль.

1) Щоб російські повідомлення відображалися в консолі коректно потрібно дотримати ТРИ умови.

1. У властивостях консолі (правої мишею на заголовку вікна cmd) повинен бути встановлений unicode шрифт, наприклад Lucida Console.

Проблеми виникають при використанні в oracle 11g на windows - dmitry bobrovsky blogdmitry

Проблеми виникають при використанні в oracle 11g на windows - dmitry bobrovsky blogdmitry

2. За кодування виведених повідомлень відповідає третя частина змінної NLS_LANG і вона повинна бути CL8MSWIN1251 (приклад, AMERICAN_CIS.CL8MSWIN1251).

3. Потрібно переключити кодову сторінку консолі на 1251, командою

Якщо всі три умови дотримані - проблем з російськими буквами не буде.

1. Зміну NLS_LANG можна задавати трьома способами:

а) (глобально) (за замовчуванням) У реєстрі в HKEY_LOCAL_MACHINE \ SOFTWARE \ ORACLE. Тут змінна може бути в декількох місцях, особливо якщо на комп'ютері кілька ORACLE_HOME. Міняти її потрібно для того ORACLE_HOME з якого запускається sqlplus. Для 64-бітних систем існує ще одна гілка реєстру для Oracle - HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ ORACLE. Якщо ви міняєте змінну, а результат не змінюється, хоча всі інші умови дотримані, значить ви міняєте не ту змінну, спробуйте поміняти взагалі все NLS_LANG, які знайдете або см.п. в).

б) (локально) Для конкретної DOS сесії. Прямо в консолі командою set

C:> SET NLS_LANG = AMERICAN_CIS.CL8MSWIN1251

в) (супер глобально) Задати як змінну оточення в ОС. Робити так я настійно НЕ рекомендую. Але, така установка перекриває змінну в реєстрі, тому якщо ви міняєте NLS_LANG в реєстрі, а результат не змінюється - перевірте змінні оточення, командою set без параметрів.

2. Зміна змінної NLS_LANG на глобальному рівні впливає на всі інші програми працюють з Oracle, наприклад EXPIMP. Тому слід бути обачним і для безпеки, для запуску sqlplus використовувати bat або cmd файл в якому міняти NLS_LANG на рівні поточної сесії.

2) Щоб повідомлення sqlplus виводилися коректно см. П. 1).

Якщо зробити все як описано в п.1) то всі повідомлення sqlplus будуть виводити коректно російською мовою. Якщо у вас немає проблем з англійською то я рекомендую виводить повідомлення sqlplus англійською мовою. Тому що в англомовному сегменті мережі набагато більше інформації ніж в російській і якщо виникне помилка то з англійської повідомленням знайти рішення буде простіше і швидше.

За мову повідомлень sqlplus і інших консольних утиліт Oracle відповідає перша частина змінної NLS_LANG. Щоб всі повідомлення було англійською мовою - її потрібно встановити як AMERICAN (наприклад, AMERICAN_CIS.CL8MSWIN1251).

3) Як встановити робочу папку щоб виконувалися вкладені скрипти.

Для цього потрібно запустити sqlplus з робочою папки. Для прикладу припустимо що в якості робочої папки потрібно використовувати папку c: \ EGRP \ SCRIPTS і запустити скрипт c: \ EGRP \ SCRIPTS \ UPDATE.sql, який викликає з себе інші скрипти, деякі з яких знаходитися в підпапках c: \ EGRP \ SCRIPTS .

C: \> cd c: EGRP \ SCRIPTS
c: \ EGRP \ SCRIPTS> c: \ app32 \ admin \ product \ 11.2.0 \ client_1 \ bin \ sqlplus.exe / nolog
SQL> @update

(На зображенні ще відображений момент перемикання кодової сторінки)

Проблеми виникають при використанні в oracle 11g на windows - dmitry bobrovsky blogdmitry

Для зручності використання, можна створити bat або cmd файл для запуску sqlplus.

REM echo off
REM Установка робочої папки (можна прибрати)
cd c: \ egrp \ scripts
SET NLS_LANG = RUSSIAN_CIS.CL8MSWIN1251
chcp тисячу двісті п'ятьдесят одна
break
REM Два варіанти запуску sqlplus
c: \ app \ admin \ product \ 11.2.0 \ dbhome_1 \ BIN \ sqlplus.exe / nolog
REM c: \ app \ admin \ product \ 11.2.0 \ dbhome_1 \ BIN \ sqlplus.exe / nolog @UPDATE
exit

- echo off - не виводити виконувані команди на консоль, а тільки результат їх виконання. Я вважаю за краще бачити що відбувається тому відключив (REM) цю команду.

- sqlplus.exe вказана з повним шляхом. Це особливо корисно на комп'ютері з кількома ORACLE_HOME, щоб точно знати який саме sqlplus ви запускаєте. Якщо повний шлях не вказувати, то буде запускатися sqlplus з папки яка першою слід в змінній оточення PATH. Якщо ORACLE_HOME один - повний шлях можна не вказувати.

- дається два варіанти запуску sqlplus. Другий варіант відразу запускає на виконання скрипт UPDATE.sql з робочою папки c: \ egrp \ scripts.