Вопрос для специалистов Oracle
2787
3
У меня есть следующий вопрос к специалистам Oracle.

Согласно рекомендациям Oracle для баз данных межнационального использования, в наших аппликациях мы переводим типы данных с VARCHAR2 на NVARCHAR2 и CHAR на NCHAR, чтобы успешно работать с unicode базами данных, которые имеют database character set равный AL32UTF8 и national character set равный AL16UTF16, с различных клиент-компьютеров, имеющих различные региональные установки (например NLS_LANG=GERMAN_GERMANY.WE8MSWIN1252, NLS_LANG=RUSSIAN_CIS.CL8MSWIN1251, NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 и т.п. с соответствующими значениями параметров Regional and Language Options в Windows операционных системах клиент-компьютеров.

Oказалось, что использование таких типов данных сопряжено с определенными проблемами. Одну из которых я продемонстрирую на примере ниже:

SQL> create table t1 (c1 nvarchar2(50));

Tabelle wurde erstellt.

SQL> insert into t1 values('2');

1 Zeile wurde erstellt.

SQL> select c1 from t1
2 union
3 select '1' as c1 from t1;
select c1 from t1
*
FEHLER in Zeile 1:
ORA-12704: character set mismatch

SQL>

Пример выполнен в SQL*Plus в немецкой среде, но тоже самое получается в русской и американской среде.

Я нашел одно решение этой проблемы, вот оно:
SQL> select c1 from t1
2 union
3 select to_nchar('1') as c1 from t1;

C1
--------------------------------------------------
1
2

SQL>

Но это решение не очень желательно для наших аппликаций по двум причинам:
- мы стараемся писать одинаковый код как для Oracle, так и для Microsoft SQL Server, в котором, кстати таких проблем с типами данных NCHAR и NVARCHAR нет;
- слишком много мест для изменений в коде аппликаций.

Может быть кому нибудь известно более элегантное решение этой проблемы ?
Акулов
так попробуйте:

select c1 from t1
union
select N'1' as c1 from t1;

И тут почитайте: http://www.oracle.com/technology/tech/globalization/htdocs/global_doc.html
tpi
так попробуйте:

select c1 from t1
union
select N'1' as c1 from t1;

И тут почитайте: http://www.oracle.com/technology/tech/globalization/htdocs/global_doc.html
Спасибо, это хороший вариант, потому что одинаково подходит для Oracle и Microsoft SQL Server. Но одна из наших апликаций кроме того бежит и на Sybase Adaptive Server Anywhere (ASA). В ASA пока не введен data types NVARCHAR и NCHAR, и видимо поэтому синтакс типа следующего:

select c1 from t1
union
select N'1' as c1 from t1;

невозможен к применение.

Нет ли в Oracle такого параметра базы данных, который бы глобально разрешал предыдущий синтаксис:

select c1 from t1
union
select '1' as c1 from t1;

в том числе и для колонок таблиц типа NVARCHAR и NCHAR ?
Акулов
С Oracle, SQL Server и ASA разобрались, теперь при внедрении этого решения в аппликацию, написанную на Power Builder мы столкнулись с проблемами внедрения запроса
select N'1' as c1 from t1
union all
select c1 from t1
в качестве основы для Data Window с Retrieval Argument (вводимым аргументом).

Мы попробовали запрос, на котором делается Data Window с вводимым аргументом сделать так:
SELECT N:sss
from component
where cmpnt_id = 0
union ALL
select cmpnt_name
from component
where cmpnt_id > 0
(получаем ORA-00923)

Может быть кто-то подскажет как технически внедрить запрос с таким синтаксисом в Data Window с Retrieval Argument в Power Bulder версии 10 или 11 ?

Может быть есть ли специализированный форум на русском языке по Power Builder ?