Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сравение результата функции to_number с числом 
:(
    Опции темы
s_a_s_h_a
Дата 4.7.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: нет
Всего: 1



проблема в следующем...
Есть запрос

Код

select to_number(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' ')) as conv_sqr
from ...


так вот, он выдает список чисел, суммирование работает

Код

select sum(t.conv_sqr)
from
(select to_number(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' ')) as conv_sqr
from ... ) t 


а такая вещь уже валится с ошибкой "ORA-01722: неверное число"

Код

select t.conv_sqr
from
(select to_number(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' ')) as conv_sqr
from ... ) t 
where t.sqr < 42


Вопрос: почему? и как обойти эти грабли?

З.Ы.: пробовал еще cast(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' ') as number(12,2)) такая же ерунда

чуть не забыл... Oracle 9

Это сообщение отредактировал(а) s_a_s_h_a - 4.7.2009, 16:11
PM MAIL   Вверх
Zloxa
Дата 5.7.2009, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(s_a_s_h_a @  4.7.2009,  16:10 Найти цитируемый пост)
Вопрос: почему?

Что такое t.sqr?

ЗЫ в таких ситуациях лучше явно указывать NLS_NUMERIC_CHARACTERS в третьем параметре to_number, либо принудительно его устанавливать перед выполнением запроса. Потому как этот параметр сессии устанавливается с клиента и,  как следствие, этот запрос может перестать работать с других клиентских машин.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
s_a_s_h_a
Дата 5.7.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: нет
Всего: 1



извиняюсь... опечатался:

Код

select t.conv_sqr
from
(select to_number(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' ')) as conv_sqr
from ... ) t 
where t.conv_sqr < 42


Запрос из Москвы гласит, что нужно посчитать средние стоимости за кв. метр. А эти квадратные метры я могу получить только из текстового поля. Пользователи могут забивать разделители целой и дробной части по разному. Я привожу все числа к одному виду, в котором это работает на моей машине, на других машинах этот запрос выполнятся не будет.

И меня интересует, как обойти грабли, когда вложенный запрос выполняется, как минимум выводятся на экран нормальные числа, а вот сравнение дальше не пашет :(
PM MAIL   Вверх
Zloxa
Дата 5.7.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(s_a_s_h_a @  5.7.2009,  20:07 Найти цитируемый пост)
как обойти грабли,

Разные грабли надо обходить по разному.
Сначала надо понять с какими граблями мы имеем дело.

Необходимо понять на каких именно  данных поднимается исключение.
Меня очень удивляет тот факт что вы можете посчитать суммму, но не можете отфильтроваться.
Но в подобной подаче ваш вопрос более похож на шараду, на задачку на сообразительность. Мол поди догадайся на чем именно ошибка стреляет и как такое может быть. 
Уверен, как только вы определите ту строку, на которой стреляет исключение, ваши вопросы отпадут автоматически. 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
s_a_s_h_a
Дата 6.7.2009, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: нет
Всего: 1



Запихал в курсор запрос, ну и if-ом условие поставил. Все замечательно работает, даже exception не пришлось ставить:

Код

declare
  p_summa number(15,2);

cursor cur is select v.re_price, to_number(replace(to_char(replace(v.sqr,'.',','),'99999999D00'),' '),'99999999D00') as sqr
from
(.....) v
where v.sqr is not null;

begin
     p_summa := 0;
     for c in cur loop
      if(c.sqr < 42) then   
         p_summa := p_summa + c.sqr;
      end if;   
     end loop;  

     dbms_output.put_line(to_char(p_summa));     
end;


в общем, хрень какая-то... и главное суммирование-то работает  smile 

Спасибо за внимание к проблеме.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1003 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.