#sql-server #oracle #oracle12c
#sql-server #Oracle #oracle12c
Вопрос:
Версия Oracle 12.1.0.2 max_string_size = extended
Я использую sql server ODBC для подключения к базе данных sql Server через Oracle gateway к sql server, соединение работает нормально, и я могу получить доступ к таблицам sql server.
Однако, согласно документации Oracle, начиная с 12c и с расширенным ограничением на тип данных varchar2 преобразование sqlserver varchar (max) в oracle Long произойдет только в том случае, если длина данных sql server превышает 32 кб.
В моей таблице sql server несколько столбцов, определенных как varchar (max), и все те, которые я вижу, преобразуются в LONG, когда я пытаюсь описать таблицу через dblink. Мне нужно загрузить данные с sql Server в oracle, и вышеупомянутая проблема сильно затрудняет это, поскольку более одного длинного столбца не может быть скопировано через dblink.
Любая помощь будет высоко оценена.
Комментарии:
1. Я думаю, что это нормально, размер
varchar2(max)
в MSSQL достигает 2G, а эквивалент Oracle равенlong
.2. Вы решили эту проблему? Потому что у меня такая же проблема в oracle 19c, а в oracle11g все работало нормально!
Ответ №1:
Я создал представление на стороне SQL server, которое использует substr (столбец, 1, 4000), чтобы соответствовать старой длине символов Oracle max 4000. Это довольно хорошо работало с Oracle 11.
Я нахожусь в процессе перехода на новый экземпляр Oracle 18, который использует набор символов AL32UTF8 вместо WE8MSWIN1252. Точно такой же SQL теперь получает:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message: [Microsoft][ODBC Driver Manager] Program type out of range {HY003} ORA-02063: preceding 2 lines from CEAV195
К счастью, у меня нет жестких сроков для решения этой проблемы.
Комментарий: теперь я получаю
[Ошибка] Выполнение (8: 17): ORA-00997: незаконное использование длинного типа данных
несмотря на использование следующего в представлении на стороне SQL Server:
приведение (substring(cr.response,1,2000) в качестве ответа varchar(2000))
Как я уже говорил ранее, это отлично работало с Oracle 11 и набором символов WE8MSWIN1252.
Комментарии:
1. я ничего не могу изменить на стороне sql Server, т.Е. создавать представления и т.д. Так что я все еще застрял.
2. Вы решили эту проблему? Потому что у меня такая же проблема в oracle 19c, а в oracle11g все работало нормально!
Ответ №2:
Я столкнулся с той же проблемой и нашел это решение в другом месте
set serverout on
DECLARE
l_cursor BINARY_INTEGER;
l_id VARCHAR2(60);
l_temp VARCHAR2(250);
l_notes VARCHAR2(32767);
BEGIN
l_cursor := DBMS_HS_PASSTHROUGH.open_cursor@remotedb;
DBMS_HS_PASSTHROUGH.parse@remotedb(
l_cursor,
'select "RecId","Notes" from "MySqlServerTable"'
);
LOOP
DBMS_HS_PASSTHROUGH.get_value@remotedb(l_cursor, 1, l_id);
DBMS_HS_PASSTHROUGH.get_value@remotedb(l_cursor, 2, l_notes);
DBMS_OUTPUT.put_line(l_id || ' ' || l_notes);
END LOOP;
exception
when others then
DBMS_HS_PASSTHROUGH.close_cursor@remotedb(l_cursor);
raise;
END;
/