Починаючи з версії 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.
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
(На зображенні ще відображений момент перемикання кодової сторінки)
Для зручності використання, можна створити 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.