|
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
|
|||
---|---|---|---|
#18+
Добрый день! Есть нюанс при обмене данными между двумя БД с разными кодировками. Параметры БД А: БД А 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.
Структура таблицы Test_B: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Содержимое таблицы 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.
В строке с SELECT получаю ошибку: ORA-06502: PL/SQL: : Bulk Bind: Truncated Bind ошибка числа или значения А если таблицу с удаленной БД Test_A@A обернуть в обзор(представление), сделать так на БД B: Код: plsql 1. 2. 3. 4. 5. 6. 7.
и потом сделать : Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
То все отрабатывает без ошибок и далее SELECT в Таблицу test_B тоже отрабатывает. В чем причина? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 10:12 |
|
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
|
|||
---|---|---|---|
#18+
В UTF8 буквы занимают от 1 (английский) до 2 - 4 байт (напр. символ №). Т.ч. то, что текст из одного поля varchar2( <какая-то цифра> ) не влезают в другое поле varchar2( <та же самая цифра ) - нет ничего удивительного. IMHO & AFAIK авторNLS_LENGTH_SEMANTICS BYTE ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 11:01 |
|
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, и какое здесь решение проблемы? NLS_LENGTH_SEMANTICS=CHAR ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 11:05 |
|
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
|
|||
---|---|---|---|
#18+
erkatrina Leonid Kudryavtsev, и какое здесь решение проблемы? NLS_LENGTH_SEMANTICS=CHAR ? AFAIK Нет NLS_LENGTH_SEMANTICS=CHAR работает слишком тупо. На мой взгляд. Мы руками размерность полей увеличивали + пришлось местами менять код. Фактически было две отличающиеся (незначительно) версии прикладной системы, одна под Windos 1251, другая под UTF8. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 11:21 |
|
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 11:41 |
|
SELECT cl8iso8859p5 INTO BULK COLLECT в БД с UTF8
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev NLS_LENGTH_SEMANTICS=CHAR работает слишком тупо. На мой взгляд. Поезд NLS_LENGTH_SEMANTICS давно покинул станцию ведь в базе A все VARCHAR2 поля таблицы Test_A УЖЕ заданы в бaйтах. erkatrina определяет: Код: plsql 1.
Соответственно все 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.
и все VARCHAR2 атрибуты получат длину в символах. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 14:14 |
|
|
start [/forum/topic.php?fid=52&fpage=44&tid=1881171]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 142ms |
0 / 0 |