2012-03-27 2 views
1

Я получаю довольно странное поведение при вызове функции oracle instr, или, возможно, я достаточно слеп, чтобы не видеть мою глупую ошибку.PL SQL oracle instr function | аномальное поведение

На самом деле я написал процедуру разделения строки. Например, если у нас есть строка

а, е, я, о, у

тогда мой раскол метод будет выглядеть

  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

+4

Вы можете разместить отверстие mehtod 'string_split'. Я не знаю, как вы определяете 'total_element'! – Tim

+0

Что касается того, почему вы получаете исключение: я также подозреваю 'total_elements' - попытаюсь удалить его и посмотреть, получилось ли вы исключение. Что касается того, почему второй работает (без «исключения большого времени»): 3-й и 4-й аргументы в 'instr' являются необязательными, поэтому он, вероятно, неявно вводит' 1' в строку ''1'' (если вы будете иметь '1' в вашем' temp_string_to_split', вы, вероятно, получите индекс первого появления) –

+0

ORA-06512: «** Причина: ** Обратное обратное сообщение как стек разматывается необработанными исключениями». [1] Помимо предоставления тестового примера с вашей проблемой или кода для разделения строки, пожалуйста, предоставьте полную трассировку стека из этой ошибки. Примечание 1: http://docs.oracle.com/cd/E11882_01/server.112/e17766/e4100.htm#sthref2109 –

ответ

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_element и i на призыв к instr, который вызвал ошибку?

+0

Вариант «SELECT LEVEL», instr ('a, e, i, o, u', ',', 1, LEVEL-1) из двойного соединения по уровню <= 5; 'производится' ORA-01428: аргумент ' 0 'находится за пределами допустимого диапазона'. –

0

Большое спасибо всем за ответы.

На самом деле, как я сказал ранее, я звоню

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

в цикле. Теперь в качестве конечного значения цикла

(total_element-i) 

получил отрицательный результат. И это был корень болезни.

Одна вещь, я все еще озадачен, хотя это так же, как это было вызванное временем выполнения условие, то есть сказать все до того, как окончательный вызов был законным. Тогда почему я не вижу на консоли результат нескольких DBMS_OUTPUT.PUT_LINE, который я установил для отслеживания выполнения.

Спасибо, Mawia