我在调用oracle instr函数时遇到了一个相当奇怪的行为,或者我可能已经盲目不知道我的愚蠢错误了。
实际上我写了一个拆分字符串的程序。例如,如果我们有字符串
A,E,I,O,U
然后我的分割方法看起来像
string_split('a,e,i,o,u',',',5);
其中第一个参数是要拆分的字符串,第二个参数是分隔符,第三个参数是拆分后我知道的元素数。
现在,在许多事情上,我的程序做的一件事就是调用
start_index := instr(temp_string_to_split,',',1,(total_element-i));
但是在它被调用的那一刻我得到了一个
ORA-06512 ,numeric or value error
但是如果我调用
start_index := instr(temp_string_to_split,1,(total_element-i));
程序运行,但不是以理想的方式运行。请注意,在第二个调用分隔符参数缺失,并且直接编号作为第二个参数传递,我猜应该导致大的时间异常。但令人惊讶的是,它运行良好。
有人可以解释这个异常......或者帮我看看我是否遗漏了什么。
谢谢, Mawia
答案 0 :(得分:2)
我假设在您致电instr
时,temp_string_to_split
是传递给string_split
的字符串,而(total_element-i)
意味着是一个迭代器要分割的数量。 (另外,当您将其作为参数传递给','
时,在此调用中对string_split
进行了硬编码似乎很奇怪。
我尝试使用以下SQL来模拟它,这很好用:
SELECT LEVEL,instr('a,e,i,o,u',',',1,LEVEL)
from dual connect by level < 5;
在导致错误的temp_string_to_split
调用中,您是否知道total_element
,i
和instr
的确切值?
答案 1 :(得分:0)
非常感谢您的回复。
实际上正如我之前所说,我正在打电话
start_index := instr(temp_string_to_split,',',1,(total_element-i));
循环。现在作为循环的最终值
(total_element-i)
变得消极。而这是疾病的根源。
有一点,我仍然感到困惑,因为这是一个运行时生成的条件,也就是说最终调用之前的所有内容都是合法的。那么为什么我在控制台上看不到DBMS_OUTPUT.PUT_LINE语句的结果,而这些语句是我用来跟踪执行的。
谢谢, Mawia