零是非法的,应该是一个,但真正的问题是异常不能被捕获。它泡到顶部,“抓住它”从未打印过。 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分钟我试图创建一个帐户并输入一个oracle bug,多次输入相同的东西。算了吧。怎么吻了。怎么样匿名的错误。 cmon oracle。
答案 0 :(得分:0)
在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不足以保存一个非常大的千兆字节等的值。