|
|
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
Использую Oracle 11. Создал обыкновенную пользовательскую функцию, в которой просто селектом получаю одно значение и вывожу его в качестве результата работы функции. Значение типа float. Всё работало нормально. Но в один прекрасный момент функция почему то стала давать неверный результат. Даёт цифру, но неправильную. Проверяю запрос внутри функции - работает правильно, даёт нужную цифру. Вызываю функцию select MyFunc(p1,p2) from dual - результат неверный. Просто пересоздал функцию ничего не меняя, делаю select MyFunc(p1,p2) from dual - результат правильный. Мистика какая то. Такое ощущение, что результат функции запомнился где то в кэше и подвис там и когда вызывал функцию, то вместо честного её выполнения результат брался старый из кэша. Как такое вообще может быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 13:34 |
|
||
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
verterКак такое вообще может быть? такого быть не может. 1. функцию 2. пример использования >>>>> результат неверный. результат правильный. >>>>> как определил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 13:39 |
|
||
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
мелафонийverterКак такое вообще может быть? такого быть не может. http://www.oracle.com/technetwork/issue-archive/2010/10-sep/o57plsql-088600.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 14:07 |
|
||
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
мелафоний, я понимаю, что не может, но как говорили в одном известном фильме: в нашей стране может быть даже то чего быть не может. функцию я приведу схематично, смысла нет приводить реальную: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 14:20 |
|
||
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
verter, Тут парень похожую ситуацию рассказывал, может поможет http://www.sql.ru/forum/1269960/raznye-rezultaty-po-odnomu-zaprosu ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 14:28 |
|
||
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous http://www.oracle.com/technetwork/issue-archive/2010/10-sep/o57plsql-088600.html да, но я не вставлял в тело своей функции директиву RESULT_CACHE RELIES_ON Она что в Oracle 11 по-умолчанию включена? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 14:35 |
|
||
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
verter, Параметр result_cache_mode стоит auto? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 14:56 |
|
||
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
xtenderverter, Параметр result_cache_mode стоит auto? Нет, стоит MANUAL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 15:20 |
|
||
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
verter, Тогда, скорее всего, ошибка в вашем коде. Нужен полный текст функции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 15:24 |
|
||
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
Из следующего: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 15:25 |
|
||
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
Из следующего: 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, то всё должно быть хорошо, т.к. оракл после этого сам будет следить за кэшем. Правильно я понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 15:27 |
|
||
|
Необъяснимый глюк с возвратом значения пользовательской функции
|
|||
|---|---|---|---|
|
#18+
проблема решается если внутри функции в селекте прописать директиву оптимизатору: SELECT /*+ result_cache */ ... INTO n FROM TABLE1; В этом случае система автоматически будет отслеживать возможные изменения таблиц в запросе и перезагружать кэш. И я ничего не путаю - в запросе не было никакой ошибки и параметр стоял в состоянии "ручной". Это какой то глюк оракла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 16:08 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39515041&tid=1885315]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
167ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 496ms |

| 0 / 0 |
