JDE, как преобразовать F983051.VRPODATA (long/blob) в строку (varchar2)?

JDE, как преобразовать F983051.VRPODATA (long/blob) в строку (varchar2)?

Я не уверен, что смогу сделать что-то вроде:

SELECT VRPID, VRVERS, FUNCTION(VRPODATA) FROM SCHEMA.F983051;

Где FUNCTION — это то, что преобразует файл BLOB в файл varchar2.

П.д. Я не могу использовать какой-либо DDL.

Пожалуйста, порекомендуйте,


person Felipe Vidal Otero    schedule 31.05.2018    source источник
comment
Вы уверены, что VRPODATA это BLOB, а не CLOB? Если это блоб, нам нужно знать его кодировку.   -  person wolφi    schedule 31.05.2018
comment
Привет, Вольфи, это буквально читается (BLOB). Не уверен, что это общий термин.   -  person Felipe Vidal Otero    schedule 01.06.2018


Ответы (3)


Обратите внимание, что у меня нет опыта работы с CONVERTTOCLOB, так как мы всегда используем ClOB для хранения текста. Ссылаясь на ответ Рене, вы можете сделать это примерно так:

CREATE TABLE F983051 (vrpid NUMBER, vrvers NUMBER, vrpodata BLOB) 
  LOB (vrpodata) STORE AS SECUREFILE;

INSERT INTO F983051(vrpid, vrvers, vrpodata) 
VALUES (1, 2, rawtohex('Hello world'));

CREATE OR REPLACE FUNCTION myblobtovarchar(p_blob BLOB) 
  RETURN VARCHAR2 DETERMINISTIC
IS
  l_len          number;
  l_clob         clob;
  l_dest_offsset integer := 1;
  l_src_offsset  integer := 1;
  l_lang_context integer := dbms_lob.default_lang_ctx;
  l_warning      integer;
  l_varchar      varchar2(32767);
BEGIN
  IF p_blob IS NULL THEN RETURN NULL; END IF;

  DBMS_LOB.CREATETEMPORARY(lob_loc => l_clob, cache => false);

  l_len := DBMS_LOB.GETLENGTH(p_blob);

  IF l_len > 4000 THEN l_len := 4000; END IF;

  DBMS_LOB.CONVERTTOCLOB(dest_lob     => l_clob,
                         src_blob     => p_blob,
                         amount       => l_len,
                         dest_offset  => l_dest_offsset,
                         src_offset   => l_src_offsset,
                         blob_csid    => dbms_lob.default_csid,
                         lang_context => l_lang_context,
                         warning      => l_warning);

  l_varchar := DBMS_LOB.SUBSTR(l_clob, 32767, 1);

  RETURN l_varchar;
END myblobtovarchar;
/

SELECT vrpid, vrvers, myblobtovarchar(vrpodata) FROM F983051;
1   2   Hello world

Если вы не можете создавать функции, вы можете попробовать (у меня тоже нет опыта):

SELECT utl_raw.cast_to_varchar2(dbms_lob.substr(vrpodata, 4000)) FROM F983051;
person wolφi    schedule 31.05.2018
comment
Привет Вольфи, большое спасибо за ваш ответ. Однако, боюсь, у меня нет прав DDL: я не могу создавать функции =S... - person Felipe Vidal Otero; 01.06.2018

На самом деле я нашел то, что хотел: DBMS_LOB.SUBSTR({поле BLOB}).

Это поле может помочь вам с типами данных BLOB и HUGEBLOB, но оно может не распознавать все значения. Он заменит их квадратами.

Пример:

SELECT DBMS_LOB.SUBSTR({Huge Blob Field}) FROM {Table};

Если вы можете работать с этим, это путь.

Ваше здоровье.

person Felipe Vidal Otero    schedule 25.10.2019

Мы размещаем наш экземпляр JD Edwards на sql-server, чтобы выполнить там ту же операцию, нужно всего лишь:

convert(nvarchar(max),convert(varbinary(max),vrpodata))

результатом по-прежнему является строка с разделителями вертикальной чертой.

person Adge Cutler    schedule 21.09.2020