Когда пользовательские функции оцениваются в запросе в Oracle?

Я столкнулся с интересным поведением при использовании определяемых пользователем функций в операторе SELECT.

У меня есть пара хранимых процедур, которые считывают и удаляют данные из одной таблицы. Эти хранимые процедуры используются несколькими источниками.

По моим наблюдениям, определяемые пользователем функции иногда оцениваются произвольно, не всегда сразу после или во время выполнения оператора SELECT, в котором он используется.

Например, в хранимой процедуре я оператор select может выглядеть примерно так:

SELECT Something, MyFunction(Something) FROM Somewhere;

За ним следует вызов другой хранимой процедуры, которая удаляет данные из таблицы. Объем очищаемых данных регулируется другой таблицей, в которой хранится максимальный прочитанный идентификатор. Это делается для того, чтобы при очистке не удалялись данные, которые еще не были прочитаны другим экземпляром выполняемой хранимой процедуры.

В моем тестовом коде MyFunction просто возвращает количество строк в таблице Somewhere. Таким образом, я бы предположил, что оно всегда должно быть равно количеству строк, возвращаемых оператором SELECT.Однако в тех случаях, когда я запускаю два экземпляра этой хранимой процедуры, я получаю примерно такие результаты:

Первый экземпляр запроса:

Something  MyFunction(Something)
---------  ---------------------
A          3
B          3
C          3

Второй экземпляр запроса:

Something  MyFunction(Something)
---------  ---------------------
A          0
B          0
C          0    

Почему второй запрос возвращает все строки, но определяемая пользователем функция, которая работает с той же таблицей, сообщает, что в таблице больше нет строк?

Могу ли я как-то гарантировать, что второй экземпляр запроса согласован в том смысле, что определяемые пользователем функции по-прежнему видят те же данные, что и родительская хранимая процедура?

6
задан acee 5 June 2012 в 22:13
поделиться