Использование DBMS_LOB.SUBSTR для BLOB приводит к ORA-06502 - PullRequest
5 голосов
/ 28 октября 2011

Когда я пытаюсь запустить функцию dbms_lob.substr в поле BLOB, я получаю следующую ошибку:

ORA-06502: PL / SQL: ошибка с числовым значением или значением: слишком длинная необработанная переменная

ORA-06512: в строке 1

Мой запрос:

select dbms_lob.substr(my_report, 10000, 1) 
from my_table where my_table.report_id = :myid

Согласно документации dbms_lob.substr , я должен иметь возможность использовать значение во 2-м параметре до 32767, а размер отчета превышает 200 000 байт, поэтому он находится в пределах диапазона ,

После игры с числом я обнаружил, что значение make, которое я могу использовать в параметре суммы (2-й параметр) для функции substr, равно 2000.

Кто-нибудь знает почему?

Ответы [ 2 ]

6 голосов
/ 28 октября 2011

Функция возвращает результат как тип данных RAW, а максимальный размер типа данных RAW составляет 2000 байтов.

Ссылки:

http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/sql_elements2a.htm#SQLRF0021

http://dbaforums.org/oracle/index.php?showtopic=8445

2 голосов
/ 29 октября 2015

Ограничение длины в 2000 октетов относится только к движку SQL. В Pl / sql вы можете использовать весь диапазон до 32767 (2 ^ 15-1).

С 12c ограничение длины 2000 снято.

Однако до 12c в клиенте sqlplus существует ограничение длины, которое не допускает размеры столбцов выше 4000 (значение для 11g2).

Следующий код работает для 11g2 и новее

var myid number;
exec :myid := 1234; -- whatever

DECLARE
    l_r   RAW(32767);
BEGIN
    select dbms_lob.substr ( my_report, 2000, 1 ) head
      into l_r
      from my_table
     where my_table.report_id = :myid  
       ;

  l_r := UTL_RAW.COPIES ( l_r, 10 );
  dbms_output.put_line ( 'id ' || :myid || ', len(l_r) = ' || utl_raw.length(l_r));
END;
/
show errors 

... в то время как для этой версии требуется 12c:

var myid number;
exec :myid := 1234; -- whatever

DECLARE
    l_r   RAW(32767);
BEGIN
    select dbms_lob.substr ( my_report, 32767, 1 ) head
      into l_r
      from my_table
     where my_table.report_id = :myid  
       ;

  dbms_output.put_line ( 'id ' || :myid || ', len(l_r) = ' || utl_raw.length(l_r));
END;
/
show errors 
...