Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
for93t
Member

Откуда:
Сообщений: 260
Уже почти с ума сошел.
Есть plsql-функция, внутри строка (вернее, часть строки):
|0|<u style="color:#777;">|</u>
Вместо <, > и " - соотвествующие html-сущности
Когда вырезаю, все отрабатывае нормально, иначе ORA-06502.
Что тут может не нравится Ораклу?
Заранее всем благодарен.
21 ноя 06, 17:38    [3431514]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
_spy_
Member

Откуда: Москва
Сообщений: 826
Код функции приведите. Возможно, строка не помещается в заданный размер переменной.
21 ноя 06, 17:43    [3431560]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
for93t
Member

Откуда:
Сообщений: 260
_spy_
Код функции приведите. Возможно, строка не помещается в заданный размер переменной.

Строка действительно большая, но я кладу ее в clob. Вряд ли поэтому.
Но на всякий случай:
create or replace function fnc_make_vetprices_xml_data(a_supplier in pls_integer,
                                                       a_manager  in pls_integer,
                                                       a_repmonth in date)
  return clob is
  result clob := empty_clob();
  cursor ng is
    select t.item_id, t.item_text
      from supplier_constants_set t
     where (t.set_id = 3) order by t.item_text;
  cursor nm(v1 pls_integer, v2 pls_integer) is
    select t.item_id, t.item_text
      from supplier_constants_set t
     where (t.set_id = 4) and (t.cat_id = v1) and ((v2 = 0) or (t.auth_id = v2))
     order by item_text;
  cursor nc(v1 pls_integer, v2 date, v3 pls_integer) is
    select t.* from supplier_nomen_prices t
     where (t.nomen_id = v1) and (for_date = trunc(v2,'mm')) and (supplier = v3)
     order by in_date desc;
  cursor const is
    select t.set_id, t.item_id, row_number() over(partition by t.set_id order by t.item_id) rn
		  from supplier_constants_set t
     where (t.set_id in (1, 2, 5, 6));
  type coll is table of number index by varchar2(32);
  dest_id coll;
	typc_id coll;
	meun_id coll;
	supp_id coll;
begin
  
  /** Заполняем массивы констант */
  for conrec in const loop
    case conrec.set_id
      when 1 then dest_id(conrec.item_id) := conrec.rn;
      when 2 then supp_id(conrec.item_id) := conrec.rn;
      when 5 then typc_id(conrec.item_id) := conrec.rn;
      when 6 then meun_id(conrec.item_id) := conrec.rn;
    end case;
  end loop;
  
  /** Инициируем результирующий clob */
  result := '<?xml version="1.0" encoding="utf-8" ?><Grid><Head><I Kind="Filter" A="-" C="" E="-" F="-" G="-" H="-" /></Head><Body><B>';
  
  /** Курсор по номенклатурным группам */
  for grec in ng loop
    result := result||'<I id="cat'||grec.item_id||'" A="-" B="-" C="'||nls_upper(grec.item_text)||'" D="-" E="-" F="-" G="-" H="-" CanDelete="0" CanEdit="0" CanFilter="0" CanFocus="0" CFormat="|0|<b>|</b>" Expanded="0">';
    
    /** Курсор по номенклатурным единицам */
    for nrec in nm(grec.item_id, a_manager) loop
 result := result||'<I id="nom'||nrec.item_id||'" A="'||nrec.item_id||'" B="-" C="'||nrec.item_text||'" D="-" E="-" F="-" G="-" H="-" CanDelete="0" CanEdit="0" CanFilter="0" CFormat="|0|<u style="color:#777;">|</u>">';
      
      /** Курсор по позициям прайс-листа данного поставщика */
      for crec in nc(nrec.item_id, a_repmonth, a_supplier) loop
        result := result||'<I id="'||crec.rowkey||'" A="-" B="'||dest_id(crec.destination)||'" C="'||nrec.item_text||'" D="'||supp_id(crec.subsupplier_id)||'" E="'||typc_id(crec.pack_type_id)||'" F="'||numfmt(crec.pack_volume)||'" G="'||meun_id(crec.pack_meas_unit_id)||'" K="'||numfmt(crec.pack_price/crec.pack_volume)||'" />';
      end loop;
      
      result := result||'</I>';
    end loop;
    
    result := result||'</I>';
  end loop;
  result := result||'</B></Body></Grid>';
  
  /** Возвращаем результат */
  return(result);
  
exception
  when others then
  begin
    if nc%isopen then close nc; end if;
		if nm%isopen then close nm; end if;
		if ng%isopen then close ng; end if;
		return '<Grid><IO Result="0" Message="ВНИМАНИЕ!!! Ошибка сервера баз данных:'||chr(13)||sqlerrm||'" /><Body><B /></Body></Grid>';
	end;  
end fnc_make_vetprices_xml_data;
В исходном варианте - все в виде html-сущностей.
21 ноя 06, 17:55    [3431663]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18385
for93t
    /** Курсор по номенклатурным единицам */
    for nrec in nm(grec.item_id, a_manager) loop
==> result := result||'<I id="nom'||nrec.item_id||'" A="'||nrec.item_id||'" B="-" C="'||nrec.item_text||'" D="-" E="-" F="-" G="-" H="-" CanDelete="0" CanEdit="0" CanFilter="0" CFormat="|0|<u style="color:#777;">|</u>">';

Здорово.
А теперь покажите пожалуйста реализацию операции ||, которая принимает CLOB :)
Вы имеете дело с неявным преобразованием в varchar2.
Для дописывания в clob используйте dbms_lob.write_append.
21 ноя 06, 18:12    [3431792]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
я бы, для начала, разделил result := result||...
на десяток таковых - локализуется (а может и рассосется;)
21 ноя 06, 18:13    [3431803]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
andrey_anonymous
..
А теперь покажите пожалуйста реализацию операции ||, которая принимает CLOB :)
Вы имеете дело с неявным преобразованием в varchar2.
Для дописывания в clob используйте dbms_lob.write_append.


Вот я тоже, в точности так думал..
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> set serveroutput on
SQL> declare
  2    result clob := empty_clob();
  3  begin
  4    for i in 1..100000 loop
  5      result := result || '1';
  6    end loop;
  7    dbms_output.put_line('во='||length(result));
  8  exception when others then
  9    dbms_output.put_line('ops='||length(result));
 10    raise;
 11  end;
 12  /
во=100000

Процедура PL/SQL успешно завершена.
21 ноя 06, 18:18    [3431834]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
_spy_
Member

Откуда: Москва
Сообщений: 826
http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96540/operators4.htm
Concatenation Operator
The concatenation operator manipulates character strings and CLOB data. Table 3-3 describes the concatenation operator.

Table 3-3 Concatenation Operator
Operator Purpose Example 
||

 Concatenates character strings and CLOB data.

 

Хотя я сам тоже всегда использовал dbms_lob.write_append.
21 ноя 06, 18:27    [3431897]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
for93t
Member

Откуда:
Сообщений: 260
orawish
я бы, для начала, разделил result := result||...
на десяток таковых - локализуется (а может и рассосется;)

Оно уже локализовалось - все дело во фрагменте строки, которую я приводил в самом начале.
Рассасывается, когда я убираю (коммментирую) эту подстроку
21 ноя 06, 19:45    [3432251]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
Sand Winter
Member

Откуда: ­ Д
Сообщений: 3272
for93t
orawish
я бы, для начала, разделил result := result||...
на десяток таковых - локализуется (а может и рассосется;)

Оно уже локализовалось - все дело во фрагменте строки, которую я приводил в самом начале.
Рассасывается, когда я убираю (коммментирую) эту подстроку


result := result||'<I id="nom'||nrec.item_id||'" A="'||nrec.item_id||'" B="-" C="'||nrec.item_text;
result := result||'" D="-" E="-" F="-" G="-" H="-" CanDelete="0" CanEdit="0" CanFilter="0" CFormat="|0|<u style="color:#777;">|</u>">';

ну так может рассосётся?
21 ноя 06, 20:05    [3432286]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18385
for93t
orawish
я бы, для начала, разделил result := result||...
на десяток таковых - локализуется (а может и рассосется;)

Оно уже локализовалось - все дело во фрагменте строки, которую я приводил в самом начале.
Рассасывается, когда я убираю (коммментирую) эту подстроку


Ну-ну:
SQL> select banner from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
PL/SQL Release 9.2.0.7.0 - Production
CORE	9.2.0.7.0	Production

TNS for Solaris: Version 9.2.0.7.0 - Production
NLSRTL Version 9.2.0.7.0 - Production

SQL> set serveroutput on
SQL> declare
  2    type d is record(item_id number default 1, item_text varchar2(10) default 'item_text'); nrec d;
  3    result clob;
  4  begin
  5    -- test #1, concatenation
  6    begin
  7      result := empty_clob();
  8      result := '<?xml version="1.0" encoding="utf-8" ?><Grid><Head><I Kind="Filter" A="-" C="" E="-" F="-" G="-" H="-" /></Head><Body><B>';
  9      for i in 1..10000 loop
 10        result := result
 11              ||'<I id="nom'
 12              ||nrec.item_id
 13              ||'" A="'
 14              ||nrec.item_id
 15              ||'" B="-" C="'
 16              ||nrec.item_text
 17              ||'" D="-" E="-" F="-" G="-" H="-" CanDelete="0" CanEdit="0" CanFilter="0" CFormat="|0|<u style="color:#777;">|</u>">';
 18      end loop;
 19      dbms_output.put_line('Concat:'||SQLERRM||' on '||dbms_lob.getlength(result) ||' symbols');
 20    exception
 21      when others then
 22        dbms_output.put_line('Concat:'||SQLERRM||' on '||dbms_lob.getlength(result) ||' symbols');
 23    end;
 24    -- test #2, writeappend
 25    declare
 26      buffer varchar2(1000) := '<I id="nom'
 27                            || nrec.item_id
 28                            || '" A="'
 29                            || nrec.item_id
 30                            || '" B="-" C="'
 31                            || nrec.item_text
 32                            || '" D="-" E="-" F="-" G="-" H="-" CanDelete="0" CanEdit="0" CanFilter="0" CFormat="|0|<u style="color:#777;">|</u>">';
 33    begin
 34      result := empty_clob();
 35      result := '<?xml version="1.0" encoding="utf-8" ?><Grid><Head><I Kind="Filter" A="-" C="" E="-" F="-" G="-" H="-" /></Head><Body><B>';
 36      for i in 1..10000 loop
 37        dbms_lob.writeappend ( result
 38                             , length(buffer)
 39                             , buffer);
 40      end loop;
 41      dbms_output.put_line('WriteAppend: '||SQLERRM||' on '||dbms_lob.getlength(result) ||' symbols');
 42    exception
 43      when others then
 44        dbms_output.put_line('WriteAppend: '||SQLERRM||' on '||dbms_lob.getlength(result) ||' symbols');
 45    end;
 46  end;
 47  /

Concat:ORA-06502: PL/SQL: numeric or value error on 32888 symbols
WriteAppend: ORA-0000: normal, successful completion on 1510121 symbols

PL/SQL procedure successfully completed

SQL>
21 ноя 06, 20:18    [3432310]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
Sand Winter
Member

Откуда: ­ Д
Сообщений: 3272
andrey_anonymous
for93t
orawish
я бы, для начала, разделил result := result||...
на десяток таковых - локализуется (а может и рассосется;)

Оно уже локализовалось - все дело во фрагменте строки, которую я приводил в самом начале.
Рассасывается, когда я убираю (коммментирую) эту подстроку


Ну-ну:


Ну!

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> set serveroutput on
SQL>  declare
  2       type d is record(item_id number default 1, item_text varchar2(10) default 'item_text'); nrec d;
  3       result clob;
  4     begin
  5       -- test #1, concatenation
  6       begin
  7         result := empty_clob();
  8         result := '<?xml version="1.0" encoding="utf-8" ?><Grid><Head><I Kind="Filter" A="-" C="" E="-" F="-" G="-" H="-" /></Head><Body><B>';
  9         for i in 1..10000 loop
 10           result := result ||'<I id="nom';
 11           result := result || to_char(nrec.item_id);
 12           result := result ||'" A="';
 13           result := result || to_char(nrec.item_id);
 14           result := result ||'" B="-" C="';
 15           result := result ||nrec.item_text;
 16           result := result ||'" D="-" E="-" F="-" G="-" H="-" CanDelete="0" CanEdit="0" CanFilter="0" CFormat="|0|<u style="color:#777;">|</u>">';
 17         end loop;
 18         dbms_output.put_line('Concat:'||SQLERRM||' on '||dbms_lob.getlength(result) ||' symbols');
 19       exception
 20         when others then
 21           dbms_output.put_line('Concat:'||SQLERRM||' on '||dbms_lob.getlength(result) ||' symbols');
 22       end;
 23       -- test #2, writeappend
 24       declare
 25         buffer varchar2(1000) := '<I id="nom'
 26                               || nrec.item_id
 27                               || '" A="'
 28                               || nrec.item_id
 29                               || '" B="-" C="'
 30                               || nrec.item_text
 31                               || '" D="-" E="-" F="-" G="-" H="-" CanDelete="0" CanEdit="0" CanFilter="0" CFormat="|0|<u style="color:#777;">|</u>">';
 32       begin
 33         result := empty_clob();
 34         result := '<?xml version="1.0" encoding="utf-8" ?><Grid><Head><I Kind="Filter" A="-" C="" E="-" F="-" G="-" H="-" /></Head><Body><B>';
 35         for i in 1..10000 loop
 36           dbms_lob.writeappend ( result
 37                                , length(buffer)
 38                                , buffer);
 39         end loop;
 40         dbms_output.put_line('WriteAppend: '||SQLERRM||' on '||dbms_lob.getlength(result) ||' symbols');
 41       exception
 42         when others then
 43           dbms_output.put_line('WriteAppend: '||SQLERRM||' on '||dbms_lob.getlength(result) ||' symbols');
 44       end;
 45     end;
 46  /
Concat:ORA-0000: normal, successful completion on 1510121 symbols
WriteAppend: ORA-0000: normal, successful completion on 1510121 symbols

PL/SQL procedure successfully completed.

без to_char как у Вас результат.
21 ноя 06, 21:06    [3432382]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18385
Sand Winter
без to_char как у Вас результат.

Позвольте резюмировать:
Можно считать доказанным, что автор имеет дело с неявным преобразованием clob к varchar2, что и приводит к 6502.
Причиной выбора именно такой формы операции, по всей видимости, является необходимость неявного преобразования number-значений.
Для решения проблемы автору достаточно оформить все "не-строчные" переменные явным преобразованием to_char(...)
21 ноя 06, 21:20    [3432401]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18385
ЗЫ: "ну-ну" относилось к "локализовалось" :)
21 ноя 06, 21:21    [3432403]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
Sand Winter
Member

Откуда: ­ Д
Сообщений: 3272
andrey_anonymous
ЗЫ: "ну-ну" относилось к "локализовалось" :)


Ну теперь-то точно локализовалось:)
21 ноя 06, 22:45    [3432538]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06502: Видимо, спецсимволы в строке, но не могу понять, какие?  [new]
for93t
Member

Откуда:
Сообщений: 260
Как все просто оказалось!!!
Действительно, после явного преобразования чисел в строки все захрюкало как надо.
Благодарю всех участвовавших в обсуждении, а особенно andrey_anonymous за точечное пападание в такую неочевидную мишень!
22 ноя 06, 11:26    [3433876]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить