Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странный глюк при вызове функции из select / 9 сообщений из 9, страница 1 из 1
03.05.2021, 21:58
    #40068160
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный глюк при вызове функции из select
Вроде простая функция, с одним параметром, а в моем оракле почему-то глючит когда передаю параметр определенного формата.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> create function Bracketize( s in varchar2 default '666' ) return varchar2 deterministic is
  2  begin
  3    return '['|| s ||']'; -- в квадратных скобках все выглядет красивее
  4  end Bracketize;
  5  /
Function created

SQL> select trim(column_value) as val, Bracketize(trim(column_value)) as str from XMLTABLE('"one","two","three"');
VAL              STR
-------------------------------------
one              [one]   -- работает замечательно!
two              [two]
three            [three]

SQL> select trim(column_value) as val, Bracketize(decode(trim(column_value),'two',null,'not two')) as str from XMLTABLE('"one","two","three"');
VAL              STR
-------------------------------------
one              [] -- должно быть [not two]
two              [] -- тут все верно
three            [] -- должно быть [not two]



Если переписать без decode(), то все в порядке:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> select trim(column_value) as val, Bracketize(case trim(column_value) when 'two' then null else 'not two' end) as str from XMLTABLE('"one","two","three"');
VAL              STR
-----------------------------------------
one              [not two]
two              []
three            [not two]

SQL> select trim(column_value) as val, Bracketize(nvl2(nullif(trim(column_value),'two'),'not two',null)) as str from XMLTABLE('"one","two","three"');
VAL              STR
-----------------------------------------
one              [not two]
two              []
three            [not two]



Если убрать "default" в определении глобальной функции, то все работает как следует ожидать.
...
Рейтинг: 0 / 0
03.05.2021, 22:30
    #40068169
Правильный Вася
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный глюк при вызове функции из select
На моём ORA 19.3 EE отрабатывает корректно.
...
Рейтинг: 0 / 0
03.05.2021, 22:40
    #40068170
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный глюк при вызове функции из select
Правильный Вася
На моём ORA 19.3 EE отрабатывает корректно.


Наверное, просто старый баг. Хорошо, что исправили.
Надо будет грепнуть все исходники на предмет передачи decode() в функции с параметрами по умолчанию.
...
Рейтинг: 0 / 0
04.05.2021, 00:04
    #40068200
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный глюк при вызове функции из select
Работает корректно и в 11.2, и 18.5, и 19+.
...
Рейтинг: 0 / 0
04.05.2021, 01:40
    #40068230
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный глюк при вызове функции из select
Sayan Malakshinov
Работает корректно и в 11.2, и 18.5, и 19+.


Спасибо что проверили. Значит, проблема именно с моим сервером.

Я попробовал с фиддл, у меня там не получилось создать функцию, поэтому пришлось найти библиотечную функцию с default у которой нет SQL аналога.

Код: sql
1.
2.
select utl_encode.text_encode('Ü',decode(trim(column_value),'two',null,'RU8PC866'))
  from XMLTABLE('"one","two","three"');



https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=d28fbfefad722bb8de232c2ec2a1af82

Фиддл (11.2 и 18) отработала как следует, а вот у меня три строки одинаковые, т.е. ошибка.
Попробовал в другой схеме - все равно ошибка.

Наверно что-то где-то сломано.
...
Рейтинг: 0 / 0
04.05.2021, 12:04
    #40068294
Melkomyagkii_newbi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный глюк при вызове функции из select
НеофитSQL,

А тримы сами по себе корректно работают?

еще интересно было бы взглянуть на вывод
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
--query transformation (dbms_sql2.expand_sql_text если ora 11g):
DECLARE
  l_clob CLOB;
BEGIN
  DBMS_UTILITY.expand_sql_text (
    input_sql_text  => '<твои запросы тут>',
    output_sql_text => l_clob
  );
  DBMS_OUTPUT.put_line(l_clob);
END;
...
Рейтинг: 0 / 0
05.05.2021, 00:59
    #40068470
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный глюк при вызове функции из select
Melkomyagkii_newbi
НеофитSQL,

А тримы сами по себе корректно работают?

еще интересно было бы взглянуть на вывод
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
--query transformation (dbms_sql2.expand_sql_text если ora 11g):
DECLARE
  l_clob CLOB;
BEGIN
  DBMS_UTILITY.expand_sql_text (
    input_sql_text  => '<твои запросы тут>',
    output_sql_text => l_clob
  );
  DBMS_OUTPUT.put_line(l_clob);
END;



Да, тримы нормально, проверил. dbms_sql2 пакет моей 11.2.0.1 версии почему-то неведом.
Я убрал XML таблицу чтоб не загромождала тримами, теперь так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
SQL> create or replace function Bracketize( s in varchar2 default '666' ) return varchar2 is
  2  begin
  3    return '['|| s ||']';
  4  end Bracketize;
  5  /

Function created.

SQL> select level, Bracketize(decode(level,2,null,'not two')) from dual connect by level <= 3;

     LEVEL     BRACKETIZE(DECODE(LEVEL,2,NULL,'NOTTWO'))
--------------------------------------------------------------------------------
         1        []
         2        []
         3        []

Execution Plan
----------------------------------------------------------
Plan hash value: 1236776825

-----------------------------------------------------------------------------
| Id  | Operation                    | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |      |     1 |     2   (0)| 00:00:01 |
|*  1 |  CONNECT BY WITHOUT FILTERING|      |       |            |          |
|   2 |   FAST DUAL                  |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(LEVEL<=3)



Баг довольно хрупкий. Если я делаю мало-мальский намек что третий параметр decode является строкой, то все работает нормально:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SQL> select level, Bracketize(decode(level,2,null||to_date(null),'not two')) from dual connect by level <= 3;

     LEVEL    BRACKETIZE(DECODE(LEVEL,2,NULL||TO_DATE(NULL),'NOTTWO'))
--------------------------------------------------------------------------------
         1       [not two]
         2       []
         3       [not two]

Execution Plan
----------------------------------------------------------
Plan hash value: 1236776825

-----------------------------------------------------------------------------
| Id  | Operation                    | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |      |     1 |     2   (0)| 00:00:01 |
|*  1 |  CONNECT BY WITHOUT FILTERING|      |       |            |          |
|   2 |   FAST DUAL                  |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(LEVEL<=3)



Если убрать default из определения функции, баг тоже исчезает.
Если параметр функции не текстовый, то бага нет, с дефолтом или без.
...
Рейтинг: 0 / 0
05.05.2021, 09:23
    #40068492
delphinotes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный глюк при вызове функции из select
НеофитSQL,

может быть проблема в том, что default '666' в какой-то момент трактуется как число? Другие варианты с default пробовали? default null? default to_char('666')?

Вообще похоже на какой-то баг в оракловом словаре, у меня была ошибка, когда триггер on delete срабатывал и на update (или наоборот, уже точно не помню)... и это случилось, когда сначала триггер был создан как триггер на update + delete, потом в ходе ряда правок осталась только одна операция и в момент компиляции моя сессия повисла.
Переименование триггера ситуацию исправило, но если вернуть имя обратно, то стабильно воспроизводится этот баг (на конкретном инстансе, 11.2.0.4 x64). Т.е. оно работает, будто в словаре осталось старое определение триггера.
...
Рейтинг: 0 / 0
05.05.2021, 17:54
    #40068650
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странный глюк при вызове функции из select
delphinotes
НеофитSQL,

может быть проблема в том, что default '666' в какой-то момент трактуется как число? Другие варианты с default пробовали? default null? default to_char('666')?

Вообще похоже на какой-то баг в оракловом словаре, у меня была ошибка, когда триггер on delete срабатывал и на update (или наоборот, уже точно не помню)... и это случилось, когда сначала триггер был создан как триггер на update + delete, потом в ходе ряда правок осталась только одна операция и в момент компиляции моя сессия повисла.
Переименование триггера ситуацию исправило, но если вернуть имя обратно, то стабильно воспроизводится этот баг (на конкретном инстансе, 11.2.0.4 x64). Т.е. оно работает, будто в словаре осталось старое определение триггера.


Я довольно детально поковырял эту проблему, значение дефолта не влияет. повторяется и с null, и с любой другой строкой дефолта. Для типов отличных от varchar/2 этот баг получить не удалось. Если в decode в третьем параметре вручную проставить тип как я сделал с конкатенацией, то баг исчезает.

Если бы это повторялось вне моего сервера, можно было бы порассуждать что где-то в этой неудобной для оракла конструкции остался косяк. Неудобной, потому что в PL/SQL коде decode не может быть параметром функции, соответственно и тест кейс нужен особый.

Но эта проблема только у меня, в различных БД и разных схемах. Надеюсь убедить моего и.о. ДБА пропатчить до последнего 11г, и тогда еще раз проверить.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странный глюк при вызове функции из select / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]