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.
No dobrze, ale dlaczego obyło się bez problemów? W jaki sposób funkcja przestała zależeć od stanu bazy i co to właściwie oznacza w tym przypadku?
OdpowiedzUsuń