Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Выбор по DBLink из MS SQL обрезает дробную часть  [new]
ChaosMP
Member

Откуда: ---->
Сообщений: 672
Из Оракла делаю запрос по линку (к MS SQL) к таблице, в которой есть поля с типом decimal(11,5), при этом Оракл получает только целую часть, дробную отбрасывает. Например, в MS SQL в таком поле лежит значение 10,80000, Оракл получает 10, пробовал выбирать данные, умноженные на 100000 (находил такой совет), не помогает, создавал переменную среды NLS_NUMERIC_CHARACTERS (присваивал ей значение ".,"), не помогает, у кого еще какие есть идеи?
24 сен 13, 10:14    [14876006]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
eev
Member

Откуда: -
Сообщений: 1156
ChaosMP,

cast (...as number (<чего нужно>))
24 сен 13, 10:21    [14876046]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
ChaosMP
Member

Откуда: ---->
Сообщений: 672
eev
ChaosMP,

cast (...as number (<чего нужно>))

То же самое, пробовал и as number(11,5) и as float и as decimal(11,5) все равно без дробной части выводит.
24 сен 13, 10:23    [14876064]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
ChaosMP
Member

Откуда: ---->
Сообщений: 672
При этом, если в MS SQL сервере поле типа float, то оракл нормально выводит дробную часть.
24 сен 13, 10:27    [14876084]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
eev
Member

Откуда: -
Сообщений: 1156
ChaosMP,

возможно трабл в преобразовании decimal. Попробуйте view на стороне sql server и в нем кастовать в другой тип, а ораклом запрашивать view.
Имхо, понимаю геморно и подбор. В моем случае помог cast, но не помню точно. Возможно опять же версии, и т.д.
24 сен 13, 10:32    [14876103]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
eev
Member

Откуда: -
Сообщений: 1156
eev
но не помню точно.
был ли decimal
24 сен 13, 10:33    [14876110]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
ChaosMP
Member

Откуда: ---->
Сообщений: 672
eev
ChaosMP,

возможно трабл в преобразовании decimal. Попробуйте view на стороне sql server и в нем кастовать в другой тип, а ораклом запрашивать view.
Имхо, понимаю геморно и подбор. В моем случае помог cast, но не помню точно. Возможно опять же версии, и т.д.

Находил и такое решение, но база в MSSQL только для чтения, на создание представления прав нет, так что хотелось бы без этого обойтись.
24 сен 13, 10:38    [14876128]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
idle_instance
Member

Откуда: Кострома
Сообщений: 547
Линк то как сделан? Если гетерогенный сервис- то там в настройках есть параметр.
24 сен 13, 10:48    [14876174]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
idle_instance
Member

Откуда: Кострома
Сообщений: 547
idle_instance
Линк то как сделан? Если гетерогенный сервис- то там в настройках есть параметр.


Вот тут я уже с этим боролся
24 сен 13, 10:49    [14876184]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
idle_instance
Member

Откуда: Кострома
Сообщений: 547
idle_instance,
https://www.sql.ru/forum/909174/dg4odbc-okruglyaet-vse-chisla-do-celogo
24 сен 13, 10:50    [14876188]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
ChaosMP
Member

Откуда: ---->
Сообщений: 672
Нет, похоже не гетерогенный сервис, на клиенте, по крайней мере не нашел даже папки hs. Через PL/SQL Developer тоже в настройках линка ничего похожего нет.
24 сен 13, 11:29    [14876400]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
-2-
Member

Откуда:
Сообщений: 15330
ChaosMP
Нет, похоже не гетерогенный сервис
тогда задай этот вопрос в ветку гомогенных меньшиств.
24 сен 13, 12:02    [14876569]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
ChaosMP
Member

Откуда: ---->
Сообщений: 672
Мда, вот это бред...
select PND,vo,mv*100000 as AMV from MyTable@MSSQL1 t

В поле AMV пишет нормальное дробное значение, умноженное на 100000, т.е. практически то, что надо. Но если к запросу дописать:
select rownum,PND,vo,mv*100000 as AMV from MyTable@MSSQL1 t

Начинает выдавать ошибку ORA-24328: неверное значение атрибута, ругаясь на поле PND (целочисленное). Далее изменяем запрос:
select rownum,to_number(PND),vo,mv*100000 as AMV from MyTable@MSSQL1 t

И получаем в поле AMV значение MV с обрезанной дробной частью и умноженное на 100000. Если в первом запросе не умножать на 100000, то получаем сразу значение MV без дробной части. Т.е. я в принципе понимаю, что в последнем запросе я явно указал преобразование поля PND к типу NUMBER, но почему Оракл попутно преобразовал все числовые поля к этому типу мне не понятно, может кто объяснит?
25 сен 13, 06:35    [14880338]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
Jaffar
Member

Откуда:
Сообщений: 633
совет простой.
на стороне MS sql конвертните нужный столбец в строку например в varchar(N) - а на стороне oracle сонвертите обратно.
тогда никто ничего не обрежет и не отбросит.

select a, b, cast(C as varchar(N)) C from mssql_table.
25 сен 13, 07:49    [14880385]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
Jaffar
совет простой.
на стороне MS sql конвертните нужный столбец в строку например в varchar(N) - а на стороне oracle сонвертите обратно.
тогда никто ничего не обрежет и не отбросит.

select a, b, cast(C as varchar(N)) C from mssql_table.
а потом появятся вопросы "а откуда у меня ORA-01722: неверное число"
25 сен 13, 09:05    [14880492]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
flexgen
Member

Откуда: Город на песке
Сообщений: 808
Jaffar
совет простой.
на стороне MS sql конвертните нужный столбец в строку например в varchar(N) - а на стороне oracle сонвертите обратно.
тогда никто ничего не обрежет и не отбросит.

select a, b, cast(C as varchar(N)) C from mssql_table.


Вообще-то ТС указывал
база в MSSQL только для чтения


Такие "простые" советы приводят к непредсказуемым последствиям, иногда включая увольнение.
25 сен 13, 13:15    [14882004]     Ответить | Цитировать Сообщить модератору
 Re: Выбор по DBLink из MS SQL обрезает дробную часть  [new]
ChaosMP
Member

Откуда: ---->
Сообщений: 672
Похоже на то, что если в запросе по линку применять функции оракла, то оракл сначала получает данные от MSSQL, потом приводит тип (при этом теряется дробная часть у DECIMAL), а потом уже применяет все операторы и свои функции, если же функции оракла не применять, т.е. только арифметические преобразования, то они выполняются на стороне MSSQL и к ораклу приходят уже в преобразованном виде. Причем эта магия происходит только с типом DECIMAL (в инете встречал упоминания, что еще и с NCHAR), с типом FLOAT ничего не теряется.
25 сен 13, 14:26    [14882595]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить