Извлечь BLOB длиной более 4000 в Oracle SQL

Я пытаюсь извлечь переменную BLOB, используя приведенный ниже запрос.

select utl_raw.cast_to_varchar2(BLOB_VAR) from Dual

Однако я получаю сообщение об ошибке.

ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 4060, maximum: 2000)

Не могли бы вы, если возможно, извлечь значение BLOB, превышающее 4000 символов, поскольку предел varchar2 составляет 4000.

Я пытался использовать опцию concat

select concat(concat(utl_raw.cast_to_varchar2(dbms_lob.substr(BYTES_,2000,1)),utl_raw.cast_to_varchar2(dbms_lob.substr(BYTES_,2000,2001))),utl_raw.cast_to_varchar2(dbms_lob.substr(BYTES_,2000,4001)))from ACT

Но я получаю эту ошибку

01489. 00000 -  result of string concatenation is too long```

Is there any way to get a longer string value?

person vijay kumar    schedule 16.05.2019    source источник
comment
проверьте вопрос и ответ здесь stackoverflow.com/questions/56129728/   -  person hotfix    schedule 16.05.2019
comment
привет @vijay kumar, вы можете найти решение для точно такой же ошибки по этой ссылке: stackoverflow.com/questions/25518780/   -  person F.Lazarescu    schedule 16.05.2019
comment
Привет @ F.Lazarescu Я не могу использовать процедуру. Есть ли способ получить без использования процедуры.   -  person vijay kumar    schedule 16.05.2019


Ответы (2)


Вы можете попробовать создать функцию, а не процедуру. Пример (выдержка из ссылки)

create or replace function F(B BLOB) 
return clob is 
  c clob;
  n number;
begin 
  if (b is null) then 
    return null;
  end if;
  if (length(b)=0) then
    return empty_clob(); 
  end if;
  dbms_lob.createtemporary(c,true);
  n:=1;
  while (n+32767<=length(b)) loop
    dbms_lob.writeappend(c,32767,utl_raw.cast_to_varchar2(dbms_lob.substr(b,32767,n)));
    n:=n+32767;
  end loop;
  dbms_lob.writeappend(c,length(b)-n+1,utl_raw.cast_to_varchar2(dbms_lob.substr(b,length(b)-n+1,n)));
  return c;
end;
/

Затем используйте функцию в любом запросе, который вам нужен.

person F.Lazarescu    schedule 16.05.2019
comment
Извините, я также не могу использовать функцию. - person vijay kumar; 16.05.2019
comment
если вы копируете и вставляете чужой код, вы также должны добавить ссылку на ресурс. - person hotfix; 16.05.2019
comment
Я всегда делаю. Я торопился. Я поищу ссылку и выложу! - person F.Lazarescu; 16.05.2019
comment
@ Виджай Кумар, ты уверен, что не можешь использовать функцию? Пытаясь решить, вы написали: select utl_raw.cast_to_varchar2(BLOB_VAR) from Dual. cast_to_varchar2 это функция. Если вы создадите свою функцию, у вас будет your_function_name вместо cast_to_varchar2 - person F.Lazarescu; 17.05.2019
comment
@F.Lazarescu Я могу использовать только встроенные функции и не имею права создавать новые - person vijay kumar; 17.05.2019
comment
Если возможно, не могли бы вы помочь мне с опцией concat? - person vijay kumar; 17.05.2019
comment
Привет, о опции concat вы можете найти здесь полезную информацию: stackoverflow.com/questions/13795220/ - person F.Lazarescu; 17.05.2019

Я нашел простой способ получить вывод с помощью функции to_clob

select to_clob(BYTES_) from ACT

person vijay kumar    schedule 17.05.2019