почему 12c с расширенным ограничением varchar2 все еще преобразует переменную sql server (max) в long

#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;
/