powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
6 сообщений из 6, страница 1 из 1
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
    #39967277
erkatrina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день! Есть нюанс при обмене данными между двумя БД с разными кодировками.
Параметры БД А:
БД А
Parameter Value NLS_CALENDAR GREGORIAN NLS_CHARACTERSET CL8ISO8859P5 NLS_COMP BINARY NLS_CURRENCY $ NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_DUAL_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_LANGUAGE AMERICAN NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_NCHAR_CONV_EXCP FALSE NLS_NUMERIC_CHARACTERS . NLS_RDBMS_VERSION 11.2.0.4.0 NLS_SORT BINARY NLS_TERRITORY AMERICA NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR


Параметры БД В:
БД В
Parameter Value NLS_CALENDAR GREGORIAN NLS_CHARACTERSET AL32UTF8 NLS_COMP BINARY NLS_CURRENCY $ NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_DUAL_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_LANGUAGE AMERICAN NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_NCHAR_CONV_EXCP FALSE NLS_NUMERIC_CHARACTERS . NLS_RDBMS_VERSION 19.0.0.0.0 NLS_SORT BINARY NLS_TERRITORY AMERICA NLS_TIME_FORMAT HH.MI.SSXFF AM NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR



Необходимо переписать данные из таблицы Test_A@A в таблицу Test_B@B используя %rowtype и bulk collect.
Структура таблицы Test_A:
Код: sql
1.
2.
3.
4.
5.
6.
7.
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
KOD                                           NOT NULL VARCHAR2(30)
KOD_ATR                                    NOT NULL VARCHAR2(3)
NAME_ATR                                                VARCHAR2(70)
AVTOR                                                      VARCHAR2(30)
DATA                                                        DATE



Структура таблицы Test_B:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> desc Table_B
Name                                      Null?        Type
----------------------------------------- -------- ----------------------------
KOD                                       NOT NULL  VARCHAR2(30 CHAR)
KOD_ATR                                NOT NULL  VARCHAR2(3 CHAR)
NAME_ATR                                             VARCHAR2(70 CHAR)
AVTOR                                                  VARCHAR2(30 CHAR)
DATA                                                    DATE



Содержимое таблицы Test_A такое:
KODKOD_ATRNAME_ATRAVTORDATA111 3 Свод (наведен/не наведен) AVTOR 29.03.2005 11:04:06 121 4 Признак завалки скрапа; вес завалки и дата нач.плавления окатышей AVTOR 29.03.2005 11:04:06 123 5 Номер ступени напряжения трансформатора AVTOR 29.03.2005 11:04:06

Открываю сеанс к БД B и делаю следующее:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare
type Test_A_type is table of Test_A@A%rowtype;
 Test_A_data spr_ed_izmer_type;
begin
select KOD,KOD_ATR,NAME_ATR,AVTOR,DATA
      bulk collect into Test_A_data
        from Test_A@A t;

--- И потом тут делаем INSERT INTO Test_B .....

end;



В строке с SELECT получаю ошибку:
ORA-06502: PL/SQL: : Bulk Bind: Truncated Bind ошибка числа или значения

А если таблицу с удаленной БД Test_A@A обернуть в обзор(представление), сделать так на БД B:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
create or replace view view_Test_A as
select t.KOD,
         t.Kod_Atr,
         t.Name_Atr,
         t.avtor,
         t.data
from Test_A@A t;



и потом сделать :
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare
type Test_A_type is table of V_Test_A%rowtype;
 Test_A_data spr_ed_izmer_type;
begin
select KOD,KOD_ATR,NAME_ATR,AVTOR,DATA
      bulk collect into Test_A_data
        from V_Test_A;

 --- И потом тут делаем INSERT INTO Test_B .....
end;



То все отрабатывает без ошибок и далее SELECT в Таблицу test_B тоже отрабатывает. В чем причина?
...
Рейтинг: 0 / 0
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
    #39967306
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В UTF8 буквы занимают от 1 (английский) до 2 - 4 байт (напр. символ №). Т.ч. то, что текст из одного поля varchar2( <какая-то цифра> ) не влезают в другое поле varchar2( <та же самая цифра ) - нет ничего удивительного.

IMHO & AFAIK

авторNLS_LENGTH_SEMANTICS BYTE
...
Рейтинг: 0 / 0
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
    #39967310
erkatrina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
и какое здесь решение проблемы? NLS_LENGTH_SEMANTICS=CHAR ?
...
Рейтинг: 0 / 0
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
    #39967315
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
erkatrina
Leonid Kudryavtsev,
и какое здесь решение проблемы? NLS_LENGTH_SEMANTICS=CHAR ?


AFAIK Нет

NLS_LENGTH_SEMANTICS=CHAR работает слишком тупо. На мой взгляд.

Мы руками размерность полей увеличивали + пришлось местами менять код. Фактически было две отличающиеся (незначительно) версии прикладной системы, одна под Windos 1251, другая под UTF8.
...
Рейтинг: 0 / 0
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
    #39967323
erkatrina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
спасибо!
...
Рейтинг: 0 / 0
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
    #39967405
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev

NLS_LENGTH_SEMANTICS=CHAR работает слишком тупо. На мой взгляд.


Поезд NLS_LENGTH_SEMANTICS давно покинул станцию ведь в базе A все VARCHAR2 поля таблицы Test_A УЖЕ заданы в бaйтах. erkatrina определяет:

Код: plsql
1.
type Test_A_type is table of Test_A@A%rowtype;



Соответственно все VARCHAR2 атрибуты получают длину в байтах. ORACLE читает данные из базы A c CL8ISO8859P5 в базу B с AL32UTF8 и происходит преобразование из CL8ISO8859P5 в AL32UTF8 где символ занимает 1 - 4 байта. Eстествeнно значения типа "Признак завалки скрапа; вес завалки и дата нач.плавления окатышей" преобразованные в AL32UTF8 занимают > 70 байт. Отсюда и ORA-06502: PL/SQL: : Bulk Bind: Truncated Bind ошибка числа или значения. Нужно просто:

Код: plsql
1.
type Test_A_type is table of Test_A@B%rowtype;



и все VARCHAR2 атрибуты получат длину в символах.

SY.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]