Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Необъяснимый глюк с возвратом значения пользовательской функции / 13 сообщений из 13, страница 1 из 1
04.09.2017, 13:34
    #39515041
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
Использую Oracle 11.
Создал обыкновенную пользовательскую функцию, в которой просто селектом получаю одно значение и вывожу его в качестве результата работы функции. Значение типа float.
Всё работало нормально. Но в один прекрасный момент функция почему то стала давать неверный результат. Даёт цифру, но неправильную. Проверяю запрос внутри функции - работает правильно, даёт нужную цифру. Вызываю функцию select MyFunc(p1,p2) from dual - результат неверный. Просто пересоздал функцию ничего не меняя, делаю select MyFunc(p1,p2) from dual - результат правильный. Мистика какая то.
Такое ощущение, что результат функции запомнился где то в кэше и подвис там и когда вызывал функцию, то вместо честного её выполнения результат брался старый из кэша. Как такое вообще может быть?
...
Рейтинг: 0 / 0
04.09.2017, 13:39
    #39515049
мелафоний
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
verterКак такое вообще может быть?

такого быть не может.

1. функцию
2. пример использования

>>>>>
результат неверный.
результат правильный.
>>>>>
как определил?
...
Рейтинг: 0 / 0
04.09.2017, 14:07
    #39515086
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
мелафонийverterКак такое вообще может быть?

такого быть не может.
http://www.oracle.com/technetwork/issue-archive/2010/10-sep/o57plsql-088600.html
...
Рейтинг: 0 / 0
04.09.2017, 14:20
    #39515094
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
мелафоний,

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

функцию я приведу схематично, смысла нет приводить реальную:

create or replace function f_myfunc(p1 in integer, p2 in integer) return float
is
Result float;
begin
select sum(t.cost)
into Result
from tbl1 t
where t.id = p1 and t.id2 = p2;

return(Result);
end;

выполняю:

select f_myfunc(10,20) res from dual

получаю: res = 123.56

выполняю отдельно:

select sum(t.cost) as res
from tbl1 t
where t.id = p1 and t.id2 = p2;

получаю: res = 756.87
...
Рейтинг: 0 / 0
04.09.2017, 14:28
    #39515104
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
verter,

Тут парень похожую ситуацию рассказывал, может поможет
http://www.sql.ru/forum/1269960/raznye-rezultaty-po-odnomu-zaprosu
...
Рейтинг: 0 / 0
04.09.2017, 14:35
    #39515115
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
andrey_anonymous http://www.oracle.com/technetwork/issue-archive/2010/10-sep/o57plsql-088600.html

да, но я не вставлял в тело своей функции директиву RESULT_CACHE RELIES_ON
Она что в Oracle 11 по-умолчанию включена?
...
Рейтинг: 0 / 0
04.09.2017, 14:56
    #39515129
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
verter,

Параметр result_cache_mode стоит auto?
...
Рейтинг: 0 / 0
04.09.2017, 15:20
    #39515149
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
xtenderverter,

Параметр result_cache_mode стоит auto?

Нет, стоит MANUAL
...
Рейтинг: 0 / 0
04.09.2017, 15:24
    #39515153
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
verter,

Тогда, скорее всего, ошибка в вашем коде. Нужен полный текст функции
...
Рейтинг: 0 / 0
04.09.2017, 15:25
    #39515154
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
Из следующего:
...
Рейтинг: 0 / 0
04.09.2017, 15:27
    #39515158
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
Из следующего:

In addition, by specifying RELIES_ON (employees), we inform Oracle Database that if any session commits changes to that table, any data in the result cache drawn from the table must be invalidated. The next call to the one_employee function would then have to execute the query and retrieve the data fresh from the table.

следует, что если я в функции включу RESULT_CACHE RELIES_ON, то всё должно быть хорошо, т.к. оракл после этого сам будет следить за кэшем. Правильно я понял?
...
Рейтинг: 0 / 0
04.09.2017, 16:08
    #39515186
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
проблема решается если внутри функции в селекте прописать директиву оптимизатору:

SELECT /*+ result_cache */ ...
INTO n
FROM TABLE1;

В этом случае система автоматически будет отслеживать возможные изменения таблиц в запросе и перезагружать кэш.

И я ничего не путаю - в запросе не было никакой ошибки и параметр стоял в состоянии "ручной". Это какой то глюк оракла.
...
Рейтинг: 0 / 0
04.09.2017, 16:10
    #39515188
verter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необъяснимый глюк с возвратом значения пользовательской функции
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Необъяснимый глюк с возвратом значения пользовательской функции / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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