Funkcje deterministyczne
Najpierw wyjaśnijmy, co to znaczy że funkcja jest lub nie jest deterministyczna. Funkcja jest
deterministyczna wtedy, kiedy dla takich samych parametrów zwróci zawsze ten sam wynik. To
oznacza, że taka funkcja musi działać zawsze w ten sam sposób, a na wynik nie powinny wpływać
żadne czynniki zewnętrzne tj. funkcja nie powinna korzystać z żadnych zmiennych pakietowych
ani innych źródeł zewnętrznych. Taka funkcja nie może też zmieniać żadnych danych w bazie (w
tabelach ani pakietach). W niektórych sytuacjach wymagane jest by funkcja była deterministyczna.
Przykładowo jeśli zechcemy użyć własnej funkcji w indeksie funkcyjnym, to funkcja ta musi być
deterministyczna. Nie tylko spełniać warunek jako taki, ale też musi to być jasno określone w treści
funkcji.
Poniżej przykład. Tworzę zwykłą funkcję, której już konstrukcja jasno wskazuje że funkcja jest
deterministyczna (wartość parametru zawsze zostanie podzielona przez 12 i zaokrąglona do 2
miejsca po przecinku). Nie jest to jednak określone specjalną klauzulą DETERMINISTIC.
Przy próbie wykorzystania takiej funkcji w indeksie funkcyjnym dostajemy błąd
„ ORA-30553 The function is not deterministic”
Teraz dodaję klauzulę DETERMINISTIC (ponadto nic się nie zmienia), i przebudowuję funkcję, a
następnie ponownie próbuję stworzyć indeks funkcyjny w oparciu o tę funkcję:
Tym razem obyło się bez problemów.