Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Изменение NLS_LANG при запуске программы.

1,045 views
Skip to first unread message

Gonchar Roman

unread,
May 20, 1999, 3:00:00 AM5/20/99
to
Имеется программа на DELPHI,которая связывается с несколькими серверами
с базами на ORACLE, таблицы в которых заполнены в разных кодировках.
Подскажите пожалуйста как програмным путем(SQL) поменять параметр языка
ORACLE
NLS_LANG например c RUSSIAN_CIS.CL8MSWIN1251 на
AMERICAN_AMERICA.US7ASCII.
Система - WIN95, параметр NLS_LANG зашит в файле регистров.
Спасибо за совет.


Dmitri Blinov

unread,
May 21, 1999, 3:00:00 AM5/21/99
to

Нужно попытаться до инициализации Oracle клиента
установить переменную окружения NLS_LANG при помощи вызова
SetEnvironmentVariable Win32 API.

Я думаю, что можно включить эту строчку в текст
файла проекта перед Application.Initialize;

Главное, это что бы разделы Initialization
ВСЕХ Units проекта не содержали кода, способного
инициализировать клиента Oracle, иначе вызов SetEnvironmentVariable
произойдет ПОСЛЕ инициализации - без нужного результата ессно.

Дмитрий.

Andrew Zhilenko

unread,
May 21, 1999, 3:00:00 AM5/21/99
to
Gonchar Roman wrote:
>
> Имеется программа на DELPHI,которая связывается с несколькими серверами
> с базами на ORACLE, таблицы в которых заполнены в разных кодировках.
> Подскажите пожалуйста как програмным путем(SQL) поменять параметр языка
> ORACLE
> NLS_LANG например c RUSSIAN_CIS.CL8MSWIN1251 на
> AMERICAN_AMERICA.US7ASCII.
> Система - WIN95, параметр NLS_LANG зашит в файле регистров.
> Спасибо за совет.
ALTER SESSION SET NLS_LANGUAGE=....

WBR, Andrew
--
Andrew Zhilenko - Database Administrator
Telenor Internet
tel.+42-02-96159436 fax. +42-02-96159422
e-mail: and...@ti.cz http://i.am/manowar/
Vaclavske namesti 4 - Praha 1 - 110 00
Czech Republic

Vladimir Shalimov

unread,
May 21, 1999, 3:00:00 AM5/21/99
to
> > Имеется программа на DELPHI,которая связывается с несколькими серверами
> > с базами на ORACLE, таблицы в которых заполнены в разных кодировках.
> > Подскажите пожалуйста как програмным путем(SQL) поменять параметр языка
> > ORACLE
> > NLS_LANG например c RUSSIAN_CIS.CL8MSWIN1251 на
> > AMERICAN_AMERICA.US7ASCII.
> > Система - WIN95, параметр NLS_LANG зашит в файле регистров.
> > Спасибо за совет.
>
> Нужно попытаться до инициализации Oracle клиента
> установить переменную окружения NLS_LANG при помощи вызова
> SetEnvironmentVariable Win32 API.
>
> Я думаю, что можно включить эту строчку в текст
> файла проекта перед Application.Initialize;
>
> Главное, это что бы разделы Initialization
> ВСЕХ Units проекта не содержали кода, способного
> инициализировать клиента Oracle, иначе вызов SetEnvironmentVariable
> произойдет ПОСЛЕ инициализации - без нужного результата ессно.

Я так понимаю (сам наступил на эти глабли и не знаю, что делать), что
требуется работать ОДHОВРЕМЕHHО с различными БД, имеющими разные NLS. Т.е.
нужно устанвливать NLS для каждой сессии, коих в приложении может быть
несколько. Вот как это сделать?


Dmitri Blinov

unread,
May 21, 1999, 3:00:00 AM5/21/99
to

Я подозреваю, что для разных сессий в пределах одного процесса
это невозможно. Либо сессии надо разносить по разным процессам
и далее организовывать взаимодействие средствами IPC,
либо использовать во всех запросах функцию CONVERT, что
так же не просто.

Дмитрий.

UniSoft

unread,
May 21, 1999, 3:00:00 AM5/21/99
to
20-May-99 13:21 Gonchar Roman wrote:
GR>Имеется программа на DELPHI,которая связывается с несколькими серверами
GR>с базами на ORACLE, таблицы в которых заполнены в разных кодировках.
GR>Подскажите пожалуйста как програмным путем(SQL) поменять параметр языка
GR>ORACLE
GR>NLS_LANG например c RUSSIAN_CIS.CL8MSWIN1251 на
GR>AMERICAN_AMERICA.US7ASCII.
GR>Система - WIN95, параметр NLS_LANG зашит в файле регистров.
GR>Спасибо за совет.
GR>
1. Из-под Delphi менять регистры как ... А регистры считываются
каждый раз ПЕРЕД коннектом.
2. И на кой ляд это нужно ??????!

BR,
Eugene


Igor Trush

unread,
May 24, 1999, 3:00:00 AM5/24/99
to
Добрый день всем!

Заранее извиняюсь, может я не совсем въехал в существо проблемы,
но по-моему , менять кодировку языка на клиенте при работе с базами в разных
кодировках не требуется. Если правильно настроен клиент, то при коннекте к
базе
перекодировка будет происходить автоматически. т.е., если я имею 2 базы с
кодировками
кои8 и 866, а на клиенте 1251, то все должно работать Ob.

Поправьте, если ошибаюсь.

С уважением,
Игорь

Gonchar Roman пишет в сообщении <3743D40F...@mail.uaz.ru> ...


>Имеется программа на DELPHI,которая связывается с несколькими серверами

>с базами на ORACLE, таблицы в которых заполнены в разных кодировках.

>Подскажите пожалуйста как програмным путем(SQL) поменять параметр языка

>ORACLE


>NLS_LANG например c RUSSIAN_CIS.CL8MSWIN1251 на

>AMERICAN_AMERICA.US7ASCII.


>Система - WIN95, параметр NLS_LANG зашит в файле регистров.

>Спасибо за совет.
>

Vladimir Shalimov

unread,
May 24, 1999, 3:00:00 AM5/24/99
to
> Заранее извиняюсь, может я не совсем въехал в существо проблемы,
> но по-моему , менять кодировку языка на клиенте при работе с базами в
разных
> кодировках не требуется. Если правильно настроен клиент, то при коннекте к
> базе
> перекодировка будет происходить автоматически. т.е., если я имею 2 базы с
> кодировками
> кои8 и 866, а на клиенте 1251, то все должно работать Ob.

Тогда встречный вопрос - а правильно это как? Т.е. вот в твоем случае какой
NLS_LANG должен быть у клиента? Или еще что-то нужно настраивать?

Vladimir Pasechnik

unread,
May 24, 1999, 3:00:00 AM5/24/99
to
In <7ib6sf$818$1...@alpha.elcat.kg> Igor Trush (tr...@elcat.kg) wrote:
|>Добрый день всем!

|>
|>Заранее извиняюсь, может я не совсем въехал в существо проблемы,
|>но по-моему , менять кодировку языка на клиенте при работе с базами в разных
|>кодировках не требуется. Если правильно настроен клиент, то при коннекте к
|>базе
|>перекодировка будет происходить автоматически. т.е., если я имею 2 базы с
|>кодировками
|>кои8 и 866, а на клиенте 1251, то все должно работать Ob.
|>
|>Поправьте, если ошибаюсь.
|>
|>С уважением,
|>Игорь
|>
Привет!

В случае клиентской программы - согласен.

Но представим себе некий сервер приложений (банальный пример,
OWAS 3.0.0), к которому обращаются различные клиенты (win1251, 866,
koi8), которые не могут выбрать иную кодировку. Как поступить в этом
случае? Под каждый тип запускать отдельный экземпляр программы (www
listener), меняя переменные окружения, или самостоятельно все
перекодировать (стандартными?! средствами в OWAS?)?

Со всеми наилучшими пожеланиями,

Владимир Пасечник

Igor Trush

unread,
May 25, 1999, 3:00:00 AM5/25/99
to

Vladimir Shalimov пишет в сообщении ...

>> Заранее извиняюсь, может я не совсем въехал в существо проблемы,
>> но по-моему , менять кодировку языка на клиенте при работе с базами в
>разных
>> кодировках не требуется. Если правильно настроен клиент, то при коннекте
к
>> базе
>> перекодировка будет происходить автоматически. т.е., если я имею 2 базы с
>> кодировками
>> кои8 и 866, а на клиенте 1251, то все должно работать Ob.
>
>Тогда встречный вопрос - а правильно это как? Т.е. вот в твоем случае какой
>NLS_LANG должен быть у клиента? Или еще что-то нужно настраивать?
>
>

Правильно - это когда с базой данных работают несколько клиентов с разными
кодировками,
а в базе все сохраняется в одной-единственной. Пример: У меня на станции
кодировка 1251, запускаю
виндовый sqlplus - пишу по-русски - в базе сохраняется в кои8. Запускаю
дос-сессию, ставлю nls_lang
RU8PC866, запускаю досовую сессию sqlplus - пишу по-русски - в базе
сохраняется в кои8. Потом могу читать это в виндовом плюсе. И так со всеми
остальными кодировками и клиентами.

С уважением,
Игорь

Igor Trush

unread,
May 25, 1999, 3:00:00 AM5/25/99
to

Vladimir Pasechnik пишет в сообщении ...

> Привет!
>
> В случае клиентской программы - согласен.
>
> Но представим себе некий сервер приложений (банальный пример,
>OWAS 3.0.0), к которому обращаются различные клиенты (win1251, 866,
>koi8), которые не могут выбрать иную кодировку. Как поступить в этом
>случае? Под каждый тип запускать отдельный экземпляр программы (www
>listener), меняя переменные окружения, или самостоятельно все
>перекодировать (стандартными?! средствами в OWAS?)?
>
> Со всеми наилучшими пожеланиями,
>
> Владимир Пасечник

С этим я пока не разбирался, но, со временем, надеюсь, эта проблема решится.
Как один из вариантов - хранить все выводимые данные в базе, а в момент
считывания страницы определять тип броузера и на лету перекодировать вывод.
Но это грешит ошибками определения кодовой
страницы броузера.

С уважением,
Игорь

Alexander Ostankov

unread,
May 25, 1999, 3:00:00 AM5/25/99
to
Vladimir Pasechnik <vp...@unisoft.dp.ua> wrote:
> Но представим себе некий сервер приложений (банальный пример,
> OWAS 3.0.0), к которому обращаются различные клиенты (win1251, 866,
> koi8), которые не могут выбрать иную кодировку. Как поступить в этом
> случае? Под каждый тип запускать отдельный экземпляр программы (www
> listener), меняя переменные окружения, или самостоятельно все
> перекодировать (стандартными?! средствами в OWAS?)?

Для OWAS кодировка сессии задается в DAD-е. Т.е. если есть
клиенты с разными кодировками, то нужно завести несколько DAD-ов
с разными значениями NLS_LANG и прописать агенты на каждый из
них. Какого агента клиент укажет в той кодировке и будет отдавать
информацию сервер.

> Владимир Пасечник

SY

-- AOR

Vladimir Pasechnik

unread,
May 26, 1999, 3:00:00 AM5/26/99
to

Для OAS 4.0.6 проверено - работает, а вот OWAS 3.0.0 (под NT
который), ну не берет NLS_CHARSET из DADа, и хоть ты тресни. Тянет
значение из регистров на момент запуска. А за отсутствием такового
показывает любимые "???", не обращая никакого внимания на DAD.
Я был "приятно" поражен увидев всю информацию в koi8 через DAD у
которого NLS_LANG c CL8MSWIN1251, поменяв в регистрах NT значение
NLS_LANG на CL8KOI8R.

Может это у него как атавизм осталось.

P.S. Выдержка из доки (информация из первых рук, так сказать):
-----------------------------------------------------------------
The PL/SQL cartridge supports all the NLS extensions supported by the
Oracle database. Versions of PL/SQL cartridge prior to Oracle Web
Application Server 3.0 supported only the NLS_LANGUAGE parameter.
This parameter was used by the cartridge to derive the NLS_LANGUAGE,
NLS_TERRITORY, and NLS_CHARSET parameters.
-----------------------------------------------------------------
|>
|> SY
|>
|>-- AOR
|>

WBR,
Владимир Пасечник


0 new messages