Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 ORA-01722: invalid number  [new]
Cotton
Member

Откуда: Киев
Сообщений: 202
Здравствуйте.
Есть следующий запрос:
select "OPFU_ID","OPFU_NAME","OPFU_COD","OPFU_OPFU"
      from CSD_OPFU t
      where exists (select 1 
                       from ums_sys.usp_users_params tt
                       where tt.uup_param = 'USR_RAION'
                             and tt.uup_iusr = uid
                             and t.opfu_id = to_number(tt.uup_value))
            or 1=0;

Описание таблиц:
SQL> desc ums_sys.usp_users_params
Name      Type          Nullable Default Comments           
--------- ------------- -------- ------- ------------------ 
UUP_ID    NUMBER                         ID                 
UUP_IUSR  NUMBER                         ІД користувача     
UUP_PARAM VARCHAR2(250) Y                Назва параметру    
UUP_VALUE VARCHAR2(250) Y                Значення параметру 
UUP_SYS   VARCHAR2(30)  Y                Система   

SQL> desc csd_opfu
Name        Type          Nullable Default Comments                                  
----------- ------------- -------- ------- ----------------------------------------- 
OPFU_ID     NUMBER                                                            
OPFU_NAME   VARCHAR2(250) Y                                                
OPFU_COD    VARCHAR2(6)   Y                                                       
OPFU_OPFU   NUMBER        Y                 
OPFU_NEW_ID NUMBER        Y                 


В указанном выше виде запрос возвращает ошибку ORA-01722: invalid number. Почему? Если убрать or 1=0 все магическим образом работает. Выражением "1=0" я заменил еще одно условие, которое возвращало FALSE. Таблица ums_sys.usp_users_params по указанному uid имеет записи, но при ограничении tt.uup_param = 'USR_RAION' данных нет. Пробовал писать через подзапросы - та же ошибка.

Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE	10.2.0.4.0	Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production


Спасибо.

--------
Любовь и боль
Покой и бой
Я как любой
Несу с собой
24 апр 12, 13:49    [12462748]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01722: invalid number  [new]
Cotton
Member

Откуда: Киев
Сообщений: 202
да, вот удалось повторить "успех" на тестовых данных:
with csd_opfu as (select 1 as opfu_id from dual union all
                  select 2 as opfu_id from dual),
     usp_users_params as (select 1968 as UUP_IUSR, 'CUR_RAION' as UUP_PARAM, '777' as UUP_VALUE from dual union all
                          select 1968 as UUP_IUSR, 'AAA' as UUP_PARAM, '777' as UUP_VALUE from dual union all
                          select 1968 as UUP_IUSR, 'BBB' as UUP_PARAM, 'ZZZ' as UUP_VALUE from dual)
  select *
      from CSD_OPFU t
      where exists (select 1 
                       from usp_users_params tt
                       where tt.uup_param = 'USR_RAION'
                             and tt.uup_iusr = uid
                             and t.opfu_id = to_number(tt.uup_value))
            or 1=0;


я догадываюсь, что дело в 'ZZZ' as UUP_VALUE, но почему убирая or 1=0 все начинает работать?
24 апр 12, 13:54    [12462803]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01722: invalid number  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Cotton,

по форуму поищите - ваша беда в том, что порядок вычисления предикатов не гарантирован (т.е. гарантировано, что он не определен)
соответственно, если результатом отбора некоторыми из предикатов является значение, к которому должно применяться преобразование типов, то это преобразование надо силовым методом отложить
например:
не
 ляля_тип = 'число' and to_number(atr) > 33

а
case when ляля_тип = 'число' then to_number(atr) end > 33
24 апр 12, 14:25    [12463068]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить