Мне нужно экспортировать Oracle данные столбца BLOB в csv или текстовый файл - PullRequest
0 голосов
/ 02 августа 2020

Мне нужно экспортировать Oracle данные столбца BLOB в csv или текстовый файл.

select Blob1 from table it gives me in binary format.

Пожалуйста, дайте мне решение для экспорта данных BLOB в csv или текстовый файл в обычном читаемом формате.

Ответы [ 3 ]

0 голосов
/ 02 августа 2020

Обычно типы данных BLOB используются для хранения двоичных объектов, таких как изображения, видео и т. Д. c. Однако, если у вас есть большой двоичный объект, содержащий символы вместо двоичных данных , вы можете сделать следующее:

1. Создает функцию для возврата большого двоичного объекта в объект класса

create or replace function blob_to_char (b blob)
return clob is
  v_clob    clob;
  n         number;
  v_start   pls_integer := 1;
  v_buffer  pls_integer := 32767;
  v_varchar varchar2(32767);
begin
  if (b is null) 
  then
    return null;
  end if;
  if (dbms_lob.getlength(b)=0) 
  then
    return empty_clob();
  end if;
  dbms_lob.createtemporary(v_clob,true);
  for i in 1..ceil(dbms_lob.getlength(b) / v_buffer)
  loop
    v_varchar := utl_raw.cast_to_varchar2(dbms_lob.substr(b, v_buffer, v_start));
    dbms_lob.writeappend(v_clob, length(v_varchar), v_varchar);
    v_start := v_start + v_buffer;
  end loop;
RETURN v_clob;
end blob_to_char;

2. Затем вы можете использовать эту функцию в любом операторе select, чтобы восстановить свой blob-объект как строку символов. Очевидно, я предполагаю, что BLOB на самом деле является строкой.

select column1, column2 , blob_to_char(your_blob_column) from your table ;

Пример

SQL> create table t ( c1 number, c2 blob );

Table created.


SQL> insert into t values ( 1 , utl_raw.cast_to_raw('ppppppppppppppppppppppppppdoekkkkkkkkkkkkkkkkkkffj') ) ;

1 row created.

SQL> commit;

SQL> create or replace function blob_to_char
  2  ( b blob)
return clob is
  v_clob    clob;
  n         number;
  v_start   pls_integer := 1;
  v_buffer  pls_integer := 32767;
  v_varchar varchar2(327  3  67);
begin
  if (b is null)
  then
  4    5    6    7    8    9   10   11   12      return null;
  end if;
 13   14    if (dbms_lob.getlength(b)=0)
  then
    return empty_clob();
 15   16   17    end if;
  dbms_lob.createtemporary(v_clob,true);
  for i in 1..ceil(dbms_lob.getlength(b) / v_buffer)
  loop
        v_varchar := utl_raw.cast_to_varchar2(dbms_lob.substr(b, v_buffer, v_start));
 18   19   20   21   22         dbms_lob.writeappend(v_clob, length(v_varchar), v_varchar);
        v_start := v_start + v_buffer;
  end loop;
RETURN v_clob;
 23   24   25   26  end;
 27  /

Function created.

SQL> select c1 , blob_to_char(c2) from t ;

        C1
----------
BLOB_TO_CHAR(C2)

--------------------------------------------------------------------------------
         1
ppppppppppppppppppppppppppdoekkkkkkkkkkkkkkkkkkffj

Тем не менее, хранить большой текст или строки с помощью BLOB - это очень плохая практика. , для этого вы должны всегда использовать CLOB, для чего он предназначен.

Обновление

Если ваш BLOB очень большой, попробуйте увеличить вывод

 SQL> SET LONG 99999999
 SQL> SELECT blob_to_char(blobcolum) from yourtable ;
0 голосов
/ 07 августа 2020

Спасибо, Роберто, это работает как шарм. SQL> УСТАНОВИТЬ ДЛИННЫЙ 99999999 SQL> ВЫБРАТЬ blob_to_char (blobcolum) из вашей таблицы;

0 голосов
/ 02 августа 2020

Вы не можете. BLOB - это большой двоичный объект. Он может содержать, например, изображения, c файлы, видео, ...

Как вы планируете экспортировать mov ie как CSV или текстовый файл? Что бы вы тогда с этим сделали?

...