Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Глупый ) вопрос по функции TO_NUMBER()  [new]
Yamaneko
Member

Откуда:
Сообщений: 18
Здравствуйте!
Подскажите ,насколько корректен такой вызов встроенной(внутренней) функции конвертации данных (символ -> число) TO_NUMBER():

to_number('N','9999999999999D9999','NLS_NUMERIC_CHARACTERS = '', ''')

Мне кажется, что это совсем не правильно!!!
Разве Оракл может по нецифровому символу подставить его численный эквивалент??

Спрашиваю, потому как в коде одной из хранимых процедур есть такой запрос:
(разумеется "N" - это пример, там проверяется символьное значение, но оно может быть только либо "Y", либо "N"). По-моему, нужно было иначе переводить эти значения, чем так:

select nvl(to_number('N','9999999999999D9999','NLS_NUMERIC_CHARACTERS = '', '''),-1) from dual

Что скажете, гуру?
24 июл 06, 10:25    [2916298]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
Ты вообще про что???

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
24 июл 06, 10:28    [2916316]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Yamaneko
Member

Откуда:
Сообщений: 18
Владимор Конев
Ты вообще про что???

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер


Корректен ли вызов функции TO_NUMBER() как это описано в посте выше?
to_number('N','9999999999999D9999','NLS_NUMERIC_CHARACTERS = '', ''')
давайте упростим
что вернет:
to_number('N')
24 июл 06, 10:30    [2916324]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
Ты уверен, что в качестве аргумента в функцию TO_NUMBER передается только 'Y' и 'N' ???

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
24 июл 06, 10:32    [2916329]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Maxifly
Member

Откуда:
Сообщений: 522
Ошибка будет.
ORA-01722 Invalid number
24 июл 06, 10:35    [2916348]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Yamaneko
Member

Откуда:
Сообщений: 18
Владимор Конев
Ты уверен, что в качестве аргумента в функцию TO_NUMBER передается только 'Y' и 'N' ???

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер

Володя!
Давай не будем уходить от основного вопроса!

ЧТО ВЕРНЕТ to_number('N')?

А на счет "уверен" - на 500%. Код и данные именно такие! -) И отложим обсуждение этого!
Вот как описывают эту функцию:
Converts Char, a value of CHAR or VARCHAR2 datatype containing a number in the format specified by the optional format model fmt, to a value of NUMBER datatype.
А в данном случае передают не-цифру (not number).

ТАК ЧТО ЖЕ ВЕРНЕТ to_number('N')?
24 июл 06, 10:39    [2916366]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Yamaneko
Member

Откуда:
Сообщений: 18
Maxifly
Ошибка будет.
ORA-01722 Invalid number

Уважаемый Максифлай!
Я это знаю. Уже проверено! -)
Может, есть какие-то "недокументированные" возможности у этой функции??
24 июл 06, 10:41    [2916373]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
Что и куда переводить-то нужно?
Если есть проблемы с понимаем кода процедуры, то почему бы не опубликовать её текст?
Может там логика так построена, что при "удачной" конвертации вызывается блок обработки "некорректных" значений в таблице.
А в случае же порождения исключения оно обрабатывается соответствующим образом, а в обработчике же "запихана" логика обработки "корректных" значений из таблицы.
Не зная задачи трудно однозначно оценить "мысль" авторов этой процедуры (кстати, а почему бы у них не спросить?)

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер
24 июл 06, 10:55    [2916439]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Yamaneko
Может, есть какие-то "недокументированные" возможности у этой функции??

;)) Варианта три - или в чужом коде ошибка-опечатка, или Вы этот чужой код неправильно интерпретируете, ну или эта функция переопределена для базы (но по-моему это уж очень экзотично ;) ). ИМХО других вариантов нет ;)
24 июл 06, 10:57    [2916448]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Yamaneko
Member

Откуда:
Сообщений: 18
Владимор Конев
Что и куда переводить-то нужно?
Если есть проблемы с понимаем кода процедуры, то почему бы не опубликовать её текст?
Может там логика так построена, что при "удачной" конвертации вызывается блок обработки "некорректных" значений в таблице.
А в случае же порождения исключения оно обрабатывается соответствующим образом, а в обработчике же "запихана" логика обработки "корректных" значений из таблицы.
Не зная задачи трудно однозначно оценить "мысль" авторов этой процедуры (кстати, а почему бы у них не спросить?)

-----------------------------------------------------------------------------------------------------------------------------------------
З.Ы.
Неспешно ищу работу, согласен на переезд в Москву или Питер


Ну что же....
Разработку спросить трудно, она в Праге сидит. Во-первых, с ними очень проблематично связаться мне - как сотруднику поддержки, минуя наш troubleshooting. Во-вторых, по-русски они почти не бельмеса.
Это к вопросу о том, чтобы спросить разработку.
Про анализ кода...
Вот Вам спорная функция.
FUNCTION SP_READINIINT
(
FileName IN VARCHAR2,
GroupName IN VARCHAR2,
Parameter IN VARCHAR2,
DefValue IN NUMBER := NULL,
VALUE OUT NUMBER
) RETURN NUMBER AS

BEGIN
SELECT nvl(TO_NUMBER(replace(Str_Value,'.', ','),'9999999999999D9999',' NLS_NUMERIC_CHARACTERS = '', '''),DefValue)
INTO VALUE
FROM Perform_Options
WHERE upper(File_Name) = upper(SP_READINIINT.FileName)
AND upper(Group_Name) = upper(SP_READINIINT.GroupName)
AND upper(Value_NAME) = upper(SP_READINIINT.Parameter);

RETURN OK;

EXCEPTION
WHEN no_data_found THEN
VALUE := DefValue;
RETURN OK;
WHEN OTHERS THEN
RETURN error;

END sp_readiniint;

Имя таблицы изменено (но это не суть важно).
В данном запросе возвращается значение некоторого флага, который у самой разработки описан как:"Флаг, определяющий [промышленная тайна]. Y - да, N - нет".
Т.е. мы получаем в функцию to_number либо Y, либо N.
Далее. Насчет обработки эксепшна.
Ну и что Вы видите в разделе EXCEPTION???
А теперь, нужно ли было все это приводить, чтобы задать простой вопрос
ЧТО ВЕРНЕТ to_number('N')?
24 июл 06, 11:16    [2916575]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
givanov
Member

Откуда:
Сообщений: 757
Yamaneko
А теперь, нужно ли было все это приводить, чтобы задать простой вопрос
ЧТО ВЕРНЕТ to_number('N')?
Да, нужно. Функция вменяемая. Если и есть где-то ошибка, то она явно выше по стеку.
24 июл 06, 11:23    [2916621]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
Yamaneko
ЧТО ВЕРНЕТ to_number('N')?

Ты же сам себе ответил на этот вопрос:

Yamaneko
Maxifly
Ошибка будет.
ORA-01722 Invalid number

Уважаемый Максифлай!
Я это знаю. Уже проверено! -)
Может, есть какие-то "недокументированные" возможности у этой функции??


Поэтому тебя и спрашивают - в чем твой вопрос, собственно?
24 июл 06, 11:25    [2916636]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Yamaneko
Member

Откуда:
Сообщений: 18
givanov
Yamaneko
А теперь, нужно ли было все это приводить, чтобы задать простой вопрос
ЧТО ВЕРНЕТ to_number('N')?
Да, нужно. Функция вменяемая. Если и есть где-то ошибка, то она явно выше по стеку.


Тест функции с параметрами, которые передаются при ее вызове постоянно возвращет ошибку выполнения.

Тот самый RETURN error; (где константа error описана как -1).

Что скажете?
24 июл 06, 11:27    [2916647]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Падонак
Member [заблокирован]

Откуда: из лесу
Сообщений: 1775
предурак, закомменть блок
WHEN OTHERS THEN
RETURN error;

и посмотри какое сообщение об ошыбке

переезжаю в Москву.
ищу работу.
24 июл 06, 11:30    [2916667]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
givanov
Member

Откуда:
Сообщений: 757
Yamaneko
Что скажете?
Не вызывайте ее с этими параметрами, вызывайте с другими.
Остальное к разработчикам.
24 июл 06, 11:31    [2916676]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Yamaneko
Member

Откуда:
Сообщений: 18
Владимор Конев
Yamaneko
ЧТО ВЕРНЕТ to_number('N')?

Ты же сам себе ответил на этот вопрос:

Yamaneko
Maxifly
Ошибка будет.
ORA-01722 Invalid number

Уважаемый Максифлай!
Я это знаю. Уже проверено! -)
Может, есть какие-то "недокументированные" возможности у этой функции??


Поэтому тебя и спрашивают - в чем твой вопрос, собственно?


Я просто хочу увериться: что и у нас стоит Oracle, который на такой код реагирует
ORA-01722 Invalid number. =))
Может, я что-то не знаю про особенности TO_NUMBER()....
24 июл 06, 11:31    [2916678]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Yamaneko
SELECT nvl(TO_NUMBER(replace(Str_Value,'.', ','),'9999999999999D9999',' NLS_NUMERIC_CHARACTERS = '', '''),DefValue)

Прикольно написано ;)
24 июл 06, 11:33    [2916692]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Yamaneko
Member

Откуда:
Сообщений: 18
Падонак
предурак, закомменть блок
WHEN OTHERS THEN
RETURN error;

и посмотри какое сообщение об ошыбке

переезжаю в Москву.
ищу работу.


Пашёл на фиг! Не магу закоментить! Я - поддержка, а не разработка! Ыдиот! Мине низя лезть код, тока ашипки аписывать...... )))
24 июл 06, 11:35    [2916708]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Владимор Конев
Member

Откуда:
Сообщений: 3451
Jannny
Yamaneko
SELECT nvl(TO_NUMBER(replace(Str_Value,'.', ','),'9999999999999D9999',' NLS_NUMERIC_CHARACTERS = '', '''),DefValue)

Прикольно написано ;)
А-га, такое ощущение, что автор сего кода пытался таким способом избежать исключения NO_DATA_FOUND для всего запроса в целом, либо пытался убежать от той самой пресловутой ORA-01722 для функции TO_NUMBER()
24 июл 06, 11:36    [2916711]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Yamaneko
Member

Откуда:
Сообщений: 18
Владимор Конев
Jannny
Yamaneko
SELECT nvl(TO_NUMBER(replace(Str_Value,'.', ','),'9999999999999D9999',' NLS_NUMERIC_CHARACTERS = '', '''),DefValue)

Прикольно написано ;)
А-га, такое ощущение, что автор сего кода пытался таким способом избежать исключения NO_DATA_FOUND для всего запроса в целом, либо пытался убежать от той самой пресловутой ORA-01722 для функции TO_NUMBER()


Мне тоже нравится))
Вот только не понятно, если заведомо будет возвращаться только Y/N, то почему обработку написали через to_number?? Ну да это вопрос уже в разработку. Вот они обрадуются! -)) Как в рекламе, "А мужики-то не знают"!!!
24 июл 06, 11:40    [2916734]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
givanov
Member

Откуда:
Сообщений: 757
Владимор Конев
Jannny
Yamaneko
SELECT nvl(TO_NUMBER(replace(Str_Value,'.', ','),'9999999999999D9999',' NLS_NUMERIC_CHARACTERS = '', '''),DefValue)

Прикольно написано ;)
А-га, такое ощущение, что автор сего кода пытался таким способом избежать исключения NO_DATA_FOUND для всего запроса в целом, либо пытался убежать от той самой пресловутой ORA-01722 для функции TO_NUMBER()
Да нет. В таблице может быть запись, но в ней лежать null. to_number(null) -> null.
Исключение NO_DATA_FOUND потом успешно ловится и обрабатывается.
Даже точки с запятыми в записи числа приводятся к единому виду.
Вполне нормальная функция.
Только называется она SP_READINIINT.
А нужно было дернуть, видимо, SP_READINIBOOL.
24 июл 06, 11:45    [2916777]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
Yamaneko
Member

Откуда:
Сообщений: 18
givanov
Владимор Конев
Jannny
Yamaneko
SELECT nvl(TO_NUMBER(replace(Str_Value,'.', ','),'9999999999999D9999',' NLS_NUMERIC_CHARACTERS = '', '''),DefValue)

Прикольно написано ;)
А-га, такое ощущение, что автор сего кода пытался таким способом избежать исключения NO_DATA_FOUND для всего запроса в целом, либо пытался убежать от той самой пресловутой ORA-01722 для функции TO_NUMBER()
Да нет. В таблице может быть запись, но в ней лежать null. to_number(null) -> null.
Исключение NO_DATA_FOUND потом успешно ловится и обрабатывается.
Даже точки с запятыми в записи числа приводятся к единому виду.
Вполне нормальная функция.
Только называется она SP_READINIINT.
А нужно было дернуть, видимо, SP_READINIBOOL.


Согласен.
Однако получаемое там значение должно быть либо Y, либо N. Даже при создании этого флага в него по дефолту прописали значение.
Возможно, это защита от дурака, когда дурак будет изменять флаг, да промажет.
Но опять же, не вижу логики.
Далее, после вызова этой функции идет анализ выходного ее парамтра VALUE, проверяется именно на да/нет (проверяется именно на Y/N - разрешите мне не приводить идущий после вызова код - поверьте на слово=)).
Что, кстати, тоже не понятно. Переменную с типом NUMBER будут сравнивать с CHAR, да еще не-цифровым (не содержащим число).
В общем, мне кажется, нашКОДила разработка.....
24 июл 06, 11:54    [2916839]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
givanov
Member

Откуда:
Сообщений: 757
Yamaneko
В общем, мне кажется, нашКОДила разработка.....
Вполне вероятно. Но кода, в котором могла бы быть ошибка Вы так и не привели.

У Вас заказная система не работает?
Или работает не так, как написано в документации?
Это повод обратиться в troubleshooting.

Возможно, ошибка в коде.
Возможно, в документации.
Возможно, в настроечных параметрах.

Все возможно.
24 июл 06, 11:59    [2916867]     Ответить | Цитировать Сообщить модератору
 Re: Глупый ) вопрос по функции TO_NUMBER()  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116100
Выполните запрос на базе

SELECT str_value , def_value, count(*)
FROM perform_options
GROUP BY str_value , def_value

Что Вы видите ?
Много ли нечисловых значений ?
Присутствуют ли в большом колтчестве значения 0/1 ?
Предполагаю, что первоначально в качестве флажков использовались 0/1,
а затем произошла утрата тайного знания :-) и в качестве флажков пошли значения Y/N, на что код рассчитан не был.
24 июл 06, 12:40    [2917175]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить