PL SQL oracle instr函数|异常行为

PL SQL oracle instr函数|异常行为,oracle,plsql,Oracle,Plsql,我在调用OracleInstr函数时遇到了一个相当奇怪的行为,或者我可能是瞎到看不到我愚蠢的错误 实际上,我编写了一个拆分字符串的过程。例如,如果我们有字符串 a、 e,i,o,u 那么我的拆分方法将如下所示 string_split('a,e,i,o,u',',',5); 其中第一个参数是要拆分的字符串,第二个参数是分隔符,第三个参数是拆分后我知道的元素数 现在,在很多事情中,我的过程要做的一件事就是调用 start_index := instr(temp_string

我在调用OracleInstr函数时遇到了一个相当奇怪的行为,或者我可能是瞎到看不到我愚蠢的错误

实际上,我编写了一个拆分字符串的过程。例如,如果我们有字符串

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));
程序运行,尽管不是以理想的方式运行。请注意,在第二个调用中缺少分隔符参数,直接将number作为第二个参数传递,我想这应该会导致大时间异常。但令人惊讶的是,它运行良好

谁能解释一下这个异常现象…或者帮我看看我是否遗漏了什么

谢谢,
Mawia

我假设在您调用
instr
时,
temp\u string\u to\u split
是传递给
string\u split
的字符串,
(total\u element-I)
是要进行的拆分数的迭代器。(顺便说一句,当您似乎要将其作为参数传递给
string\u split
时,您在这个调用中硬编码了
,”
,这似乎很奇怪

我尝试使用以下SQL来模拟这一点,效果很好:

SELECT LEVEL,instr('a,e,i,o,u',',',1,LEVEL)
from dual connect by level < 5;
SELECT LEVEL,instr('a,e,i,o,u','1,LEVEL)
通过小于5级的双连接;

您知道导致错误的
instr
调用时
temp\u string\u to\u split
total\u element
i
的准确值吗?

非常感谢大家的响应

事实上,正如我早些时候所说的,我是在打电话

 start_index := instr(temp_string_to_split,',',1,(total_element-i));
在循环中。现在作为循环的最终值

 (total_element-i)
这是疾病的根源

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

谢谢,
Mawia

你能发布孔方法
字符串分割
吗?我不知道你如何确定
总元素
!至于为什么会出现异常:我也怀疑
总元素
-试着删除它,看看你是否会出现异常。至于第二种方法为什么有效(没有“大时间异常”):指令中的第三个和第四个参数是可选的,因此它可能会将
1
隐式转换为字符串
'1'
(如果在
临时字符串中有
1
,则可能会得到第一次出现的索引)ORA-06512:“原因:堆栈被未处理的异常解除时的回溯消息。”[1]除了提供问题的测试用例或拆分字符串的代码外,请提供错误的完整堆栈跟踪。注意1:使用数字秒参数调用
INSTR
不会生成错误,因为该参数正在转换为字符串。例如。
选择INSTR('12345',23)FROM DUAL
返回
2
而不是生成错误。变量,
从DUAL逐层连接中选择LEVEL,instr('a,e,i,o,u',',',',,1,LEVEL-1)