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

Откуда:
Сообщений: 1570
Два запроса, во втором, для первого возвращаемго столбца добавляю cast, результат других столбцов тоже меняется
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 

SQL> with t as
  2    (select 'A1' a  from dual
  3     union all
  4     select 'A2' from dual
  5     union all
  6     select 'A3' from dual
  7     union all
  8     select 'A4' from dual
  9     union all
 10     select 'A5' from dual
 11    )
 12  select a a1,substr(a,2,1) a2,a a3 from t;

A1 A2 A3
-- -- --
A1 1  A1
A2 2  A2
A3 3  A3
A4 4  A4
A5 5  A5

SQL> 
SQL> with t as
  2    (select 'A1' a  from dual
  3     union all
  4     select 'A2' from dual
  5     union all
  6     select 'A3' from dual
  7     union all
  8     select 'A4' from dual
  9     union all
 10     select 'A5' from dual
 11    )
 12  select cast(a as varchar2(1)) a1,substr(a,2,1) a2,a a3 from t;

A1 A2 A3
-- -- --
A     A
A     A
A     A
A     A
A     A
13 окт 06, 15:24    [3259792]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Да, cast известный гадёнышь
select
    cast(tname as varchar2(20)) a22
   ,cast(tname as varchar2(3))  a3
  from tab where rownum<11;
  
select
    cast(tname as varchar2(20)) a20
   ,cast(tname as varchar2(3))  a3
  from tab where rownum<11;
  
select
    cast(tn1 as varchar2(2))  a2
   ,cast(tn2 as varchar2(30)) a30
  from (select tname        tn1
              ,tname||null  tn2
          from tab
         where rownum <11
       );
13 окт 06, 15:37    [3259865]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
рука дрогнула - о как
select
    cast(tname as varchar2(3)) a3
   ,cast(tname as varchar2(20))  a3
  from tab where rownum<11;
  
select
    cast(tname as varchar2(20)) a20
   ,cast(tname as varchar2(3))  a3
  from tab where rownum<11;
  
select
    cast(t1 as varchar2(3))  a2
   ,cast(t2 as varchar2(20)) a30
  from (select tname t1,tname t2
          from tab
         where rownum < 11
       );
  
select
    cast(tn1 as varchar2(3))  a2
   ,cast(tn2 as varchar2(20)) a30
  from (select tname        tn1
              ,tname||null  tn2
          from tab
         where rownum <11
       );
13 окт 06, 15:42    [3259902]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
а рекомендация - cast(substr(
13 окт 06, 15:44    [3259918]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
DimaR
Member

Откуда:
Сообщений: 1570
будем привыкать и к этому
13 окт 06, 16:15    [3260138]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
2
orawish
не могли бы вы пояснить к чему надо привыкать???? у меня на 10 вроде все отрабатывает нормально?!
13 окт 06, 16:30    [3260252]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Vint
2
orawish
не могли бы вы пояснить к чему надо привыкать???? у меня на 10 вроде все отрабатывает нормально?!


Так, что ли?
Присоединен к:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select cast(tname as varchar2(3)) a3  from tab;
select cast(tname as varchar2(3)) a3  from tab
            *
ошибка в строке 1:
ORA-25137: Нарушен диапазон значений данных
13 окт 06, 16:42    [3260335]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
а у меня все отрабатывает нормально на той же версии
select
    cast(fc_value as varchar2(20)) a22
   ,cast(fc_value as varchar2(3))  a3
  from tentitydata where rownum<11;
  
select
    cast(fc_value as varchar2(20)) a20
   ,cast(fc_value as varchar2(3))  a3
  from tentitydata where rownum<11;
  
select
    cast(tn1 as varchar2(2))  a2
   ,cast(tn2 as varchar2(30)) a30
  from (select fc_value        tn1
              ,fc_value||null  tn2
          from tentitydata
         where rownum <11
       );
select
    cast(tn1 as varchar2(3))  a2
   ,cast(tn2 as varchar2(20)) a30
  from (select fc_value        tn1
              ,fc_value||null  tn2
          from tentitydata
         where rownum <11
       );
Что делаю не так????
13 окт 06, 16:58    [3260432]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Ты выбрал из примеров те, которые как раз 'правильно' работают (если
только вообще, работают см. мой 10.2 :).
Посмотри внимательно - порядок следования столбцов в запросе влияет на результат.
13 окт 06, 17:09    [3260496]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Вот - как оно выглядит с результатами.
Ну и еще раз повторю - cast(substr( лечит и фокусы девятки и пдёжь десятки.
Oracle9i Enterprise Edition Release 9.2.0.5.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.5.0 - Production

SQL> select
  2      cast(tname as varchar2(3))  a3
  3     ,cast(tname as varchar2(20)) a20
  4    from tab where rownum < 11;

A3  A20
--- --------------------
A__ A__
A__ A__
A__ A__
A__ A__
A__ A__
A__ A__
A__ A__
A__ A__
A__ A__
A_C A_C

10 строк выбрано.

SQL>
SQL> select
  2      cast(tname as varchar2(20)) a20
  3     ,cast(tname as varchar2(3))  a3
  4    from tab where rownum < 11;

A20                  A3
-------------------- ---
A__DATA              A__
A__DATA01            A__
A__DATA03            A__
A__DATAROWS          A__
A__RELCHECK          A__
A__RELCHECKDETAILS   A__
A__TEMPROWS          A__
A__UNCHECKINGROWS    A__
A__UNUSEDROWS        A__
A_COLUMNSUM          A_C

10 строк выбрано.

SQL>
SQL> select
  2      cast(t1 as varchar2(3))  a2
  3     ,cast(t2 as varchar2(20)) a30
  4    from (select tname t1,tname t2
  5            from tab
  6           where rownum < 11
  7         );

A2  A30
--- --------------------
A__ A__
A__ A__
A__ A__
A__ A__
A__ A__
A__ A__
A__ A__
A__ A__
A__ A__
A_C A_C

10 строк выбрано.

SQL>
SQL> select
  2      cast(tn1 as varchar2(3))  a2
  3     ,cast(tn2 as varchar2(20)) a30
  4    from (select tname        tn1
  5                ,tname||null  tn2
  6            from tab
  7           where rownum < 11
  8         );

A2  A30
--- --------------------
A__ A__DATA
A__ A__DATA01
A__ A__DATA03
A__ A__DATAROWS
A__ A__RELCHECK
A__ A__RELCHECKDETAILS
A__ A__TEMPROWS
A__ A__UNCHECKINGROWS
A__ A__UNUSEDROWS
A_C A_COLUMNSUM

10 строк выбрано.
13 окт 06, 17:19    [3260553]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
CAHbKA
Member

Откуда:
Сообщений: 171
воспроизвёл на 10.1.0.4 и 10.2.0.2 - получаю ровно то же, что и в примерах с 9-ой.
и "ORA-25137: Нарушен диапазон значений данных" не происходит... сижу и гадаю, что такое "пдёжь десятки" и как его случайно не включить?
14 окт 06, 22:51    [3262563]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
...Буча...
Guest
orawish
Вот - как оно выглядит с результатами.
SQL> select
2 cast(tn1 as varchar2(3)) a2
3 ,cast(tn2 as varchar2(20)) a30
4 from (select tname tn1
5 ,tname||null tn2
6 from tab
7 where rownum < 11
8 );

A2 A30
--- --------------------
A__ A__DATA
A__ A__DATA01
A__ A__DATA03
A__ A__DATAROWS
A__ A__RELCHECK
A__ A__RELCHECKDETAILS
A__ A__TEMPROWS
A__ A__UNCHECKINGROWS
A__ A__UNUSEDROWS
A_C A_COLUMNSUM

10 строк выбрано.[/src]


немного не понял почему Оракл считает, что конкатенация tname||null дает другой столбец...?? чего за баг такой?
16 окт 06, 08:34    [3263900]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
CAHbKA
воспроизвёл на 10.1.0.4 и 10.2.0.2 - получаю ровно то же, что и в примерах с 9-ой.
и "ORA-25137: Нарушен диапазон значений данных" не происходит... сижу и гадаю, что такое "пдёжь десятки" и как его случайно не включить?

Я имел ввиду именно ora-25137 посетившую мою 10.2.0.1
А, то что это хочется 'не включить' - вопрос спорный. По мне - лучше
пусть запрос матерно отказывает, чем втихаря режет данные.
16 окт 06, 12:53    [3265181]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: cast as баг или фича?  [new]
rifle
Member

Откуда: Kiev
Сообщений: 123
Так, а что это все таки за баг такой?
Делаю одинаковые запросы, на разных серверах, но с одной версией б.д. (Oracle Database 10g Enterprise Edition Release 10.2.0.4.0)

SELECT 
  CAST(object_name AS VARCHAR2(3))
FROM user_objects;

На одном сервере обрезает до 3, на другом нет. От чего это зависит и как это настроить, кроме как везде использовать substr?
18 авг 10, 17:58    [9285102]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
rifle
Member

Откуда: Kiev
Сообщений: 123
rifle
Так, а что это все таки за баг такой?
Делаю одинаковые запросы, на разных серверах, но с одной версией б.д. (Oracle Database 10g Enterprise Edition Release 10.2.0.4.0)

SELECT 
  CAST(object_name AS VARCHAR2(3))
FROM user_objects;

На одном сервере обрезает до 3, на другом нет. От чего это зависит и как это настроить, кроме как везде использовать substr?


но при этом отрабатывает корректно такой запрос
select cast('asasas' as varchar2(1)) from dual;

Выходит проблема только когда кастятся поля таблиц?
18 авг 10, 18:04    [9285168]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
_Alex_SMIRNOV_
Member

Откуда: Киев
Сообщений: 1519
rifle
Так, а что это все таки за баг такой?
Делаю одинаковые запросы, на разных серверах, но с одной версией б.д. (Oracle Database 10g Enterprise Edition Release 10.2.0.4.0)

SELECT 
  CAST(object_name AS VARCHAR2(3))
FROM user_objects;

На одном сервере обрезает до 3, на другом нет. От чего это зависит и как это настроить, кроме как везде использовать substr?



ну зачем же искать приключения на свою в будущем... используйте substr....
18 авг 10, 18:07    [9285199]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
rifle
Member

Откуда: Kiev
Сообщений: 123
На будущее так и буду делать!
Но вот в голове не укладывается, как может один и тот же запрос возвращать разные данные, на разных серверах. Какие факторы могут на это влиять? Может есть какой-то хитрый патч, который исправляет это недоразумение?
18 авг 10, 18:15    [9285279]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: cast as баг или фича?  [new]
egik87
Member

Откуда:
Сообщений: 76
Столкнулись с той же проблемой, что и rifle.
Oracle 10.2 На одном из серверов не работает CAST. Мы им обрезаем длину полей VARCHAR2 и на этом сервере после каста она не меняется. Почему такое может быть? (Про substr знаю, хотелось бы узнать почему каст не работает)
18 дек 12, 12:48    [13648077]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
egik87
Столкнулись с той же проблемой, что и rifle.
Oracle 10.2 На одном из серверов не работает CAST. Мы им обрезаем длину полей VARCHAR2 и на этом сервере после каста она не меняется. Почему такое может быть? (Про substr знаю, хотелось бы узнать почему каст не работает)

баг он и есть баг. в 11g исправлен. ну а пока не мигрировали - имейте его ввиду.
по всему - проблема выросла от попыток оптимизации запросов на предмет однократного хранения/вычисления значений
столбцов, которые в выражениях(в столбцах запроса) встречаются больше одного раза.
соответственно, чтобы такое обстоятельство преодолеть, надо любым способом убедить компилятор в том, что каждое
упоминание того столбца есть совершенно отличное от других выражение.
+
-- о как! :(
select
    cast(tname as varchar2(2))  a2
   ,cast(tname as varchar2(30)) a30
  from tab;
-- еще веселее.. :(
select
    cast(tn1 as varchar2(2))  a2
   ,cast(tn2 as varchar2(30)) a30
  from (select tname            tn1
              ,'<'||tname||'>'  tn2
          from tab);
-- и так тоже.. :(
select
    cast(tname as varchar2(2))  a2
   ,cast(tname as varchar2(30)) a30
  from (select tname
          from tab
         where rownum > 0
       );
-- ..чтобы уже работало :)
select
    cast(tn1 as varchar2(2))  a2
   ,cast(tn2 as varchar2(30)) a30
  from (select tname        tn1
              ,tname||null  tn2
          from tab
         where rownum > 0
       );
18 дек 12, 14:56    [13649059]     Ответить | Цитировать Сообщить модератору
 Re: cast as баг или фича?  [new]
egik87
Member

Откуда:
Сообщений: 76
orawish
Больше спасибо!
18 дек 12, 18:54    [13650532]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить