BLOB-дегі DBMS_LOB.SUBSTR-ты пайдалану ORA-06502 нәтижесіне әкеледі

BLOB өрісінде dbms_lob.substr функциясын іске қосуға тырысқанда, келесі қатені аламын:

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 сәйкес, code> documentation , мен екінші параметрде 32767 мәніне қол жеткізуге тиіспін және есептің өлшемі 200,000 байтты құрайды, сондықтан ол ауқымның ішінде.

Нөмірмен ойнағаннан кейін, мен параметр параметрінде (2-параметр) қолдануға болатын мәннің мәні substr функциясына 2000 деп анықтадым.

Неліктен біреу біледі?

4

2 жауаптар

Функция нәтижені 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

6
қосылды

2000 octet ұзындығының шектеуі тек 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 
2
қосылды