Погода: 4 °C
29.031...3пасмурно, снег с дождем
30.031...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

    "Самый мудрый внешне во всём подобен самому глупому", народная китайская мудрость.

  • В ответ на: так попробуйте:

    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 ?

    Исправлено пользователем Акулов (02.08.07 23:21)

Записей на странице:

Перейти в форум

Модератор: