Исключение в regexp_instr при использовании clob uncatchable? - PullRequest
0 голосов
/ 16 февраля 2011

Ноль недопустим, должен быть равен единице, но реальная проблема заключается в том, что исключение не может быть перехвачено.Это пузыри к вершине, и "поймал это" никогда не печатается.D () просто записывает в вывод dbms.Исключение можно поймать, если я поменяю clob на varchar2.Тот факт, что исключение не удалось отловить, является ошибкой, верно?Исключение составляет ora-01428, аргумент «0» выходит за пределы допустимого диапазона.

declare
    v int;
    p_in clob := 'i think i can init like this';     
begin
    d('started');
    v := regexp_instr(p_in, 'some_regexp', 0);
    d('it worked');
exception when others then
    d('caught it');
end;    

Вы знаете, просто знайте, что сообщение об ошибке компании должно восприниматься как скорее подарок компании, а не мучительный опытПользователь.30 минут я бездельничал, пытаясь создать учетную запись и ввести ошибку оракула, вводя то же самое несколько раз.забудь это.что случилось, чтобы поцеловать.как насчет анонимных ошибок.cmon oracle.

1 Ответ

0 голосов
/ 16 февраля 2011

В Oracle XE (10.2.0.1) происходит следующее: необработанное исключение в строке 1

declare
    v int;
    p_in clob := 'i think i can init like this';
begin
    v := regexp_instr(p_in, 'some_regexp', 0);
exception 
  when others then
    dbms_output.put_line('caught');
end;    
/

Поскольку он находится в строке 1, он даже не может войти в раздел объявления, поэтому он не попадает в обработчик исключений.

 declare
     v int;
     p_in clob := 'i think i can init like this'; begin
     select regexp_instr(p_in, 'some_regexp', 0) into v from dual;
 end;
 /

ошибки в строке 5 и

declare
    v int;
    p_in clob := 'i think i can init like this';
begin
    select regexp_instr(p_in, 'some_regexp', 0) into v from dual;
exception 
  when others then
    dbms_output.put_line('caught');
end;    
/

ловит ошибку.

=============================================== ========================== PS. Похоже, что проблема сводится к STANDARD.REGEXP_INSTR

select package_name, object_name, overload,  argument_name, 
       position, sequence, data_type, in_out, pls_type
from all_arguments 
where object_name = 'REGEXP_INSTR' order by overload, position

обозначает две процедуры, одну для VARCHAR2 и одну для CLOB. CLOB имеет NUMBER / INTEGER в качестве параметра POSITION, тогда как VARCHAR2 имеет BINARY_INTEGER / PLS_INTEGER. Я предполагаю, что PLS_INTEGER недостаточно велик, чтобы содержать значение для очень большого CLOB в гигабайтах и ​​т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...