PL SQL оракул instr функция | аномальное поведение - PullRequest
1 голос
/ 27 марта 2012

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

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

а, е, я, о, и

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

         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

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Я предполагаю, что при вашем вызове 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 голосов
/ 28 марта 2012

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

На самом деле, как я уже говорил ранее, я звонил

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

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

 (total_element-i)

становилось отрицательным.И это было корнем болезни.

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

Спасибо, Mawia

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...