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_splittotal_elementi 的确切值吗?

【讨论】:

变体SELECT LEVEL,instr('a,e,i,o,u',',',1,LEVEL-1) from dual connect by level &lt;= 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|异常行为的主要内容,如果未能解决你的问题,请参考以下文章

Instr函数在oracle存储过程里怎么用

Oracle中nvl()instr()及执行多条sql事务操作

2. instr用法

PL/SQL - XML Clob 错误

oracle中类似indexof用法_instr函数

PL/SQL 程序将代码分成两部分