sobota, 14 grudnia 2013

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.

1 komentarz:

  1. 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ń