PL SQL oracle instr函数|异常行为
我在调用OracleInstr函数时遇到了一个相当奇怪的行为,或者我可能是瞎到看不到我愚蠢的错误 实际上,我编写了一个拆分字符串的过程。例如,如果我们有字符串 a、 e,i,o,u 那么我的拆分方法将如下所示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
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)