LINUX.ORG.RU

2 вопроса по работе с Oracle (язык программирования - Си)


0

0

Здравствуйте.

И снова вопросы по Oracle.

1) можно ли как-то грамотно указать Oracle, в какой кодировке я хочу получать от него данные? Сейчас делаю тупо:

в начале программы:

setenv ("NLS_LANG", "RUSSIAN_CIS.UTF8", 1);

(можно, конечно просто вне программы эту переменную задать, не важно)

можно ли регулировать это не переменными окружения, а OCI-функцией какой-нибудь. OCIEnvNlsCreate () просит какой-то числовой идентификатор кодировки. Но откуда я возьму этот числовой идентификатор, зная что мне нужна "UTF-8"?

2) можно ли какой-нибудь OCI-функцией регулировать формат получаемой даты? хочу формат ISO, а получаю то ЧЧ.ММ.ГГГГ, то ЧЧ.ММ.ГГ? или это регулируется только в настройках самого сервера? (дату запрашиваю в external type VARCHAR2 SQLT_CHR). или лучше дату/время получать как-то иначе? как?

Заранее спасибо.

А спросить гугл ? По запросу OCIEnvNlsCreate первая же ссылка ведет на страницу, которая подскажет, что есть функция OCINlsCharSetNameTold.

cobold ★★★★★
()
Ответ на: комментарий от cobold

Эта функция есть и в документации, я не понимаю, что ей передавать в качестве первого аргумента. Там хэндлер сессии или окружения нужен. Но сессия ещё не начата. Окружение пока тоже не создано, OCINlsEnvCreate как раз и должно его создать. какой хэндлер ему надо?

jackLucas
() автор топика

немного исправил:

1)

setenv ("NLS_LANG", "RUSSIAN_CIS.AL32UTF8", 0);

("AL32UTF8" - начитался документации к DBD::Oracle, 0 - чтобы значение переменной окружения не затиралось, если есть)

2)

SELECT to_char (data_rash, 'YYYY-MM-DD') , bort_n FROM xxx

==============================================

но вопросы остаются, как регулировать оба эти момента на уровне сессии средствами OCI функций.

заранее спасибо.

jackLucas
() автор топика
Ответ на: комментарий от jackLucas

можно один раз получить идентификатор кодировки (для этого достаточно пары сторочек кода) и потом его использовать:

// получаем идентификатор кодировки OCIEnvNlsCreate(&Env, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL, 0, 0); ub2 charsetid=OCINlsCharSetNameToId(Env, "AL32UTF8"); // возвращает 873

// а теперь используем его везде, где нужно // #define CHARSETID_AL32UTF8 873 OCIEnvNlsCreate(&Env, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL, CHARSETID_AL32UTF8, CHARSETID_AL32UTF8);

anonymous
()
Ответ на: комментарий от jackLucas

навряд ли будет меняться. скорее всего идентификаторы кодировок жестко определены раз и навсегда.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.