Выгрузка данных с полем типа CLOB

yaromyrkh
Дата: 18.09.2015 15:04:45
Добрый день! Помогите решить проблему:
Из представления таблицы необходимо выгрузить данные в таблице другой БД. Связь между БД организована с помощью ДБ-линка. В исходном представлении, некоторые даты хранятся в unix-формате, для преобразования которых в обычный формат применяю следующий скрипт:
to_date('01.01.1970 00:00:00', 'DD.MM.YYYY HH24:MI:SS') + NUMTODSINTERVAL(last_resolved_date,'SECOND')
Для преобразования поля типа CLOB (resolution), которое находиться в представлении таблицы использую функцию to_char.
При выполнении следующего скрипта:
insert into test_rem_inc
select
to_date('01.01.1970 00:00:00', 'DD.MM.YYYY HH24:MI:SS') + NUMTODSINTERVAL(last_resolved_date,'SECOND'),
to_date('01.01.1970 00:00:00', 'DD.MM.YYYY HH24:MI:SS') + NUMTODSINTERVAL(submit_date,'SECOND'),
to_char(resolution)
from aradmin.hpd_help_desk@ODWDB_REM_DBLINK where submit_date > 1420070400 and submit_date < 1420156800

Oracle выдает ошибку ORA-22992: cannot use use LOB locators selected from remote table
Но например при отработке следующего скрипта все проходит без проблем:
insert into test_rem_inc2
select
to_char(resolution),
serviceci -- тип char
from aradmin.hpd_help_desk@ODWDB_REM_DBLINK where submit_date > 1420070400 and submit_date < 1420156800.

Предполагаю, что проблема связана с тем что на два поля "навешаны" функции (как в первом случае to_char на resolution и to_date на остальные).
K790
Дата: 18.09.2015 15:10:59
yaromyrkh,

restrictions на lobs по дб линку в доке написано.
yaromyrkh
Дата: 18.09.2015 15:16:52
Можете скинуть ссылку?
Zloxa
Дата: 18.09.2015 17:09:04
yaromyrkh
Можете скинуть ссылку?

http://docs.oracle.com/database/121/ADLOB/adlob_working.htm#ADLOB2010
Only standalone LOB columns are allowed in the select list for statements
yaromyrkh
Дата: 21.09.2015 10:38:34
Zloxa, благодарю за ссылку. Действительно, в соответствии с документацией, первый скрипт работать не должен, так как я использую на поле типа LOB функцию, которая не возвращает скаляр (см. Functions on remote LOBs returning scalars). Однако в соответствии с этим же ограничением, последний скрипт, в моем первом сообщении, также не должен был работать.
Можете объяснить, почему в одном случае функция to_char работает, а в другом нет?
Zloxa
Дата: 21.09.2015 15:24:15
yaromyrkh,

Объяснить не могу. Могу лишь предположить, что в первом случае to_char выполняется на вызывающей стороне, во втором - на удаленной. И, кстати, в моем понимании, to_char и есть функция, возвращающая скаляр, так что, по идее, если руководствоваться именно этим пунктом, неработоспособность первого запроса не объясняется.

Мне, лично, очень не понравилось в рестрикшнах фраза, которую я процитировал, тем более что она относится непосредственно к примеру с insert .. select . "Only standalone LOB columns are allowed in the select list for statements". Я затрудняюсь для себя определить что именно под этим имеется в виду, в моем воспаленном воображении рождается множество разночтений. В качестве доминирующей в моем воображении версии, успешная работа второго случая - баг.
yaromyrkh
Дата: 21.09.2015 16:59:57
Zloxa, спасибо вам за комментарий :)
Если это действительно баг - то побольше бы подобных работающих багов. Действительно, совсем неясно (по-крайней мере мне) как понимать, фразу "standalone LOB columns". С моей стороны была попытка заменить to_char на dbms_lob.substr(resolution, 500), что привело к аналогичным результатам.
Может быть посоветуете вариант, как при одновременной выгрузке изменить и поле типа CLOB на char, и совершить преобразования с другими полями?
orawish
Дата: 21.09.2015 17:35:04
yaromyrkh
Zloxa, спасибо вам за комментарий :)
Если это действительно баг - то побольше бы подобных работающих багов. Действительно, совсем неясно (по-крайней мере мне) как понимать, фразу "standalone LOB columns". С моей стороны была попытка заменить to_char на dbms_lob.substr(resolution, 500), что привело к аналогичным результатам.
Может быть посоветуете вариант, как при одновременной выгрузке изменить и поле типа CLOB на char, и совершить преобразования с другими полями?

это - глубокое заблуждение (имхо)

а вообще, что у вас в тех лобах? размер данных какой? ( наибольший / распределение какое)
yaromyrkh
Дата: 21.09.2015 17:43:55
orawish, размер данных не велик, от силы 500 символов, но зачастую меньше, думаю 200 символами можно обойтись.
О баге, наверно, вы правы, однако приятно было бы, если сработало все-таки.
orawish
Дата: 21.09.2015 17:53:00
yaromyrkh,
create table tb1 (n number,tx clob);
create view v_tb1 as select n,cast(substr(tx,1,4000) as varchar2(4000)) as tx from tb1;
desc v_tb1