PL SQL oracle instr函数|异常行为

时间:2012-03-27 13:58:31

标签: oracle plsql

我在调用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

2 个答案:

答案 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_elementiinstr的确切值?

答案 1 :(得分:0)

非常感谢您的回复。

实际上正如我之前所说,我正在打电话

 start_index := instr(temp_string_to_split,',',1,(total_element-i));

循环。现在作为循环的最终值

 (total_element-i)

变得消极。而这是疾病的根源。

有一点,我仍然感到困惑,因为这是一个运行时生成的条件,也就是说最终调用之前的所有内容都是合法的。那么为什么我在控制台上看不到DBMS_OUTPUT.PUT_LINE语句的结果,而这些语句是我用来跟踪执行的。

谢谢, Mawia