Документацията дава причина защо може да видите несъответствие (подчертайте мое):
Внимание:
Тъй като SQL е декларативен език, а не императивен (или процедурен), не можете да знаете колко пъти ще се изпълни функция, извикана от SQL израз — дори ако функцията е написана на PL/SQL, императивен език. Ако вашето приложение изисква функция да бъде изпълнена определен брой пъти, не извивайте тази функция от SQL израз. Вместо това използвайте курсор.
Например, ако вашето приложение изисква функцията да бъде извикана за всеки избран ред, след това отворете курсора, изберете редове от курсора и извикайте функцията за всеки ред. Тази техника гарантира, че броят на извикванията на функцията е броят на редовете, извлечени от курсора.
По принцип Oracle не уточнява колко пъти дадена функция ще бъде извикана в sql оператор:може да зависи от версията, средата, пътя за достъп наред с други фактори.
Въпреки това, има начини за ограничаване на пренаписването на заявка, както е обяснено в главата Демонтиране на вложени подзаявки:
Отмяната на подзаявката отменя и слива тялото на подзаявката в тялото на израза, който го съдържа, позволявайки на оптимизатора да ги разглежда заедно, когато оценява пътищата за достъп и присъединяванията. Оптимизаторът може да отмени повечето подзаявки, с някои изключения . Тези изключения включват йерархични подзаявки и подзаявки, които съдържат псевдоколона ROWNUM, един от операторите за набор, вложена агрегатна функция или корелирана препратка към блок на заявка, който не е непосредственият външен блок на заявката на подзаявката.
Както беше обяснено по-горе, можете да използвате ROWNUM
псевдоколона, за да попречи на Oracle да отмени подзаявка:
SQL> WITH data AS (SELECT SYS_GUID() uuid FROM DUAL WHERE ROWNUM >= 1)
2 SELECT uuid, uuid FROM data;
UUID UUID
-------------------------------- --------------------------------
1ADF387E847F472494A869B033C2661A 1ADF387E847F472494A869B033C2661A