powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Конвертация полей из LONG в BLOB
16 сообщений из 16, страница 1 из 1
Конвертация полей из LONG в BLOB
    #39989088
WНаталья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имеется таблица remote_stud, состоящая из 2х стобцов id_stud и foto_stud
база данных студентов удаленная и была создана в firebird
в ней содержатся id студента и его фото

мне нудно эту таблицу сохранить на локальном сервере.
проблема возникает в том, что oracle не понимает тип данных столбца фото.
предполагаю, что это LONG
нужно конвертировать в BLOB (ведь в этом формате хранятся картинки?)

запрос типа

Код: plsql
1.
2.
insert into loc_stud(loc_id_stud, loc_foto_stud ) 
values (id_stud , select to_lob(foto_stud) from remote_stud@"spbgti123.ru" where id_stud = 1  ) 



выполняется с ошибкой
illegal use of LONG datatype


В чем может быть проблема? как конвентировать из long d в blob&
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989099
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WНаталья,

select to_lob..
не работает потому, что to_lob это dml-функция
книжку почитайте - и всё наладится и тут, на сайте примеры были
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989100
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WНатальяпроблема возникает в том, что oracle не понимает тип данных столбца фото.
предполагаю, что это LONG

Человек предполагает, а у Firebird нет типа LONG, только BLOB.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989108
WНаталья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

то есть получается, надо наоборот? из blob в long?
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989113
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WНатальято есть получается, надо наоборот?

Получается, что кавалерийским наскоком не ничего получится, надо разбираться, моск
морщить. Возможно, поставить под сомнение саму необходимость перекачки данных в Оракул,
раз уж у вас нет специалистов по нему и использовать Firebird же в качестве локального
сервера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989130
WНаталья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
спасибо, на одна из пунктов лаборототной работы состоит в том, чтобы взять удаленную таблицу и скопировать в локальную базу без ошибок. Никакой инфы больше по FireBird не давали, а по оралку в методичке только пару строк теории как выполнять селетк и инсерт.
Не поделитесь с начинающим админом БД женского пола полезной ссылочкой конвертации типов или как пересохранить таблицу с картинками из FireBird в оракл.
заранее благодарю, не судите строго за незнание вопроса.
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989180
WНаталья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

нашла решение, но почему-то не работает даже этот запрос


Код: plsql
1.
2.
3.
4.
SELECT *
  FROM   TABLE(
              dla_pkg.query_view(   'select 123 from dual'
                  ) )




ошибка
dla_pkg.query_view invalid identifier
"%S: invalid identifier
''
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989187
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тыкать пальцем в небо - отнюдь не самый удачный способ работы, с Ораклом в частности.

Возможно, проблема в том, что само подключение через дблинк несколько некорректно произведено? Изобразите его тут.See Also:Oracle Database Administrator's Guide for information on specifying remote databases
---
Если проблема действительно в странном преобразовании Firedird.BLOB -> Oracle.LONG, которое как-то происходит при подключении к удалённой БД, то обратное - процесс неочевидный, т.к. средств работы с LONG в Оракле почти нет, это почти вымерший тип данных.

Вот хитрый выверт как пища для размышлений. Напрямую с картинкой вряд ли покатит, не влезет она в 4000.
Код: plsql
1.
2.
3.
SELECT XS.col_expr
FROM XMLTABLE( '/ROWSET/ROW' PASSING ( SELECT DBMS_XMLGEN.GETXMLTYPE( 'запрос на одно значение' ) FROM Dual )
  COLUMNS col_expr VARCHAR2( 4000 ) PATH 'COLUMN_EXPRESSION' ) XS

...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989233
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего проблема на уровне HS ODBC
Все что не char и не number тупо обзывается LONG и как хотите, так и танцуйте

Я бы попробовал зайти с другой стороны, вставить из FB в Oracle
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989265
WНаталья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,

обычный seleсt к удаленной БД выполняется. И на этом мой доступ к ей заказчивается. Ничего вставить туда или добавить я не могу, так как моей роли недостаточно грантов, а добить их не могут, чтобы ничего не поламала.

я создала view c и в него скопировала результат запроса select

desc показал, что поля "FOTO" - long raw
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989279
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WНаталья,

Тогда смотрите в сторону PL/SQL (Здесь у меня CLOB, но разницы нет)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
DESC dropme@mm

Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 s1                                                 LONG
 s2                                                 VARCHAR2(4000 CHAR)
 s3                                                 VARCHAR2(2000 CHAR)
 s4                                                 VARCHAR2(50 CHAR)
 id                                                 NUMBER(10)

create or repace type t_dropme_row as object (
id number
,s1 clob
,s2 varchar2(4000)
,s3 varchar2(2000)
,s4 varchar(50)
);

create or replace type t_dropme_tab as table of t_dropme_row;

create or replace function f_dropme_tab return t_dropme_tab
pipelined
as
rout  t_dropme_row := t_dropme_row(0,null,null,null,null);
begin
dbms_lob.createtemporary(rout.s1,true);
for rin in (SELECT * FROM dropme@mm) loop
 rout.id := rin."id";
 rout.s1 := to_clob(rin."s1");
 rout.s2 := rin."s2";
 rout.s3 := rin."s3";
 rout.s4 := rin."s4";
 pipe row (rout);
end loop;
end;
/

SQL> set LONG 10000
SQL> select s1,length(s1) from table(f_dropme_tab);
...
736.......737.......738.......739.......740.......741.......742.......743.......
744.......745.......746.......747.......748.......749.......750.......751.......
752.......753.......754.......755.......756.......757.......758.......759.......

S1
--------------------------------------------------------------------------------
LENGTH(S1)
----------
760.......761.......762.......763.......764.......765.......766.......767.......
768.......769.......770.......771.......772.......773.......774.......775.......
776.......777.......778.......779.......780.......781.......782.......783.......
784.......785.......786.......787.......788.......789.......790.......791.......
792.......793.......794.......795.......796.......797.......798.......799....
      7997



Рекомендую также очень полезную статью по теме:
working with long columns
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989339
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WНатальяdesc показал, что поля "FOTO" - long raw

Значит так криво Оракул интерпретирует ODBC тип LONGVARBINARY. Надо либо найти настройку,
которая это изменит, либо использовать другие способы импорта данных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989351
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Сталкивался
Ни hsodbc, ни hsmsql тупо все что длиннее 4000 байт превращают в long raw
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #39989396
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim LejninНи hsodbc, ни hsmsql тупо все что длиннее 4000 байт превращают в long raw

Может, кому-нибудь стоит накатать SR, а то странно как-то использовать неподдерживаемый
тип как умолчание...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #40003971
WНаталья
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,
Задачу частично решила с помощью piperow функции.
Но возникла другая проблема.
Картинки, которые больше 32000 режутся, так как в long ограничен этим размером.

Если кому интересно, вот решение для маленьких картинок

1. Создаем 2 составных вспомогательных типа

Код: plsql
1.
2.
3.
4.
5.
create or replace type get_pers_foto_ex_type_obj_1 as object
 ( id_field number(10), -- id сотрудника
   foto  blob, -- фото в формате  blob
   dupdate date -- дата  обновления  фото 
 );


____

Код: plsql
1.
create or replace type get_pers_foto_type_ex_type_t_1 as table of get_pers_foto_ex_type_obj_1;



2. Создаем конвейерную функцию с преобразованием в BLOB

Код: plsql
1.
2.
3.
4.
5.
6.
7.
create or replace FUNCTION get_pers_foto_PIPELINED RETURN get_pers_foto_type_ex_type_t_1 PIPELINED AS
   BEGIN
     FOR r IN (SELECT PERS_ID,foto, dupdate FROM table ) LOOP
         PIPE ROW(get_pers_foto_ex_type_obj_1(r.PERS_ID,TO_BLOB(r.foto), to_date(r.dupdate, 'yyyy.mm.dd'))) ;
      END LOOP;
       RETURN;
END; 


3. Создаем процедуру для вставки записей, в которой прогоняем каждую строку через созданную ранее функцию


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create or replace PROCEDURE GET_PERS_FOTO_INSERT 
  IS  
 i Number;
BEGIN
   i := 0;
   For pers In (
   Select id_field, foto, dupdate
   From table(get_pers_foto_PIPELINED)
) Loop

  Insert Into FOTO_TABLE (PERS_ID, foto, dupdate) Values(pers.id_field, pers.foto,  pers.dupdate);
  i := i + 1;
  End Loop;
  Commit;

END PROCEDURE GET_PERS_FOTO_INSERT;



4. Вызываем ее и радуеся.

Код: plsql
1.
Exec GET_PERS_FOTO_INSERT 



... но до тех пор, пока картинка не превышает 32000 байт.

Вопрос с преобразованием закрыт.
...
Рейтинг: 0 / 0
Конвертация полей из LONG в BLOB
    #40004059
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WНаталья

Картинки, которые больше 32000 режутся, так как в long ограничен этим размером.

а так понял оракля поле видит как long raw

простой insert не работает insert into t2 select id,to_lob(l) from t;?

SQL> desc t
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
L LONG RAW

SQL> desc t2
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
B BLOB

.....
stax
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Конвертация полей из LONG в BLOB
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]