PL SQL oracle instr function|异常行为
Posted
技术标签:
【中文标题】PL SQL oracle instr function|异常行为【英文标题】:PL SQL oracle instr function|anomalous behaviour 【发布时间】:2012-03-27 13:58:31 【问题描述】:我在调用 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));
程序运行,但不是以理想的方式运行。请注意,在第二次调用中缺少分隔符参数,并且直接将数字作为第二个参数传递,我猜这应该会导致大时间异常。但令人惊讶的是,它运行良好。
谁能解释一下这个异常...或者帮我看看我是否遗漏了什么。
谢谢, 马维亚
【问题讨论】:
你能把洞方法贴出来string_split
。不知道你怎么确定total_element
!
至于你为什么会得到异常:我也怀疑total_elements
- 尝试删除它,看看你是否得到异常。至于为什么第二个有效(没有“大时间例外”):instr
中的第三和第四个参数是可选的,因此它可能将1
隐式转换为字符串'1'
(如果你有@987654332 @ 在你的temp_string_to_split
中你可能会得到第一次出现的索引)
ORA-06512:“原因: 由于堆栈被未处理的异常展开,所以回溯消息。” [1] 除了提供问题的测试用例或拆分字符串的代码外,请提供错误的完整堆栈跟踪。注1:docs.oracle.com/cd/E11882_01/server.112/e17766/…
使用数字第二个参数对INSTR
的三参数调用不会产生错误,因为该参数正在转换为字符串。例如。 SELECT INSTR( '12345', 23 ) FROM DUAL
返回 2
而不是生成错误。
【参考方案1】:
我假设在您对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;
您知道在调用instr
时导致错误的temp_string_to_split
、total_element
和i
的确切值吗?
【讨论】:
变体SELECT LEVEL,instr('a,e,i,o,u',',',1,LEVEL-1) from dual connect by level <= 5;
产生ORA-01428: argument '0' is out of range
。【参考方案2】:
非常感谢大家的回复。
其实我之前说过,我在打电话
start_index := instr(temp_string_to_split,',',1,(total_element-i));
在一个循环中。现在作为循环的最终值
(total_element-i)
变得消极。这就是病根。
有一件事,我仍然感到困惑,因为它是运行时生成的条件,也就是说,在最终调用之前的一切都是合法的。那为什么我在控制台上看不到我为跟踪执行而放入的少数 DBMS_OUTPUT.PUT_LINE 语句的结果。
谢谢, 马维亚
【讨论】:
以上是关于PL SQL oracle instr function|异常行为的主要内容,如果未能解决你的问题,请参考以下文章