How to Use DETERMINISTIC Functions in PL/SQL

Declare pure PL/SQL functions DETERMINISTIC so Oracle can skip repeated calls and allow them in function-based indexes and virtual columns.

A function is deterministic when it always returns the same result for the same arguments: converting kilometers to miles is, looking up today's exchange rate is not. Declaring a function DETERMINISTIC tells Oracle so. Oracle may then avoid repeated calls with the same arguments, and it is required before the function can be used in a function-based index or a virtual column.

Code for This Guide

The main examples are in the examples/subprograms folder of the Oracle Database 26ai code repository on GitHub, each with its output. They use NIMBUS, the sample schema of a fictional airline, which you can install with the scripts in the setup/nimbus folder.

They come from Oracle Database 26ai SQL and PL/SQL Book.

Syntax

create [or replace] function name (params) return type
  deterministic
is
begin
  ...
end;

Oracle does not check the claim. A function declared DETERMINISTIC that reads tables or SYSDATE can return stale results from an index or a cache, so declare it only for pure calculations.

A Deterministic Function in a Query

KM_TO_MILES is a pure calculation, declared DETERMINISTIC. The example also creates AIRPORT_CITY, a result-cache function covered separately.

Example:

create or replace function km_to_miles (p_km number) return number
  deterministic
is
begin
  return round(p_km / 1.609344);
end;
/
create or replace function airport_city (p_code char) return varchar2
  result_cache
is
  v_city airports.city%type;
begin
  select city into v_city from airports where airport_code = p_code;
  return v_city;
end;
/
select origin, airport_city(origin) as city, distance_km, km_to_miles(distance_km) as miles
from   routes
where  route_id <= 3;

Output:

Function KM_TO_MILES compiled

Function AIRPORT_CITY compiled

ORIGIN    CITY         DISTANCE_KM    MILES
_________ _________ ______________ ________
DXB       Dubai               5497     3416
LHR       London              5497     3416
DXB       Dubai               5239     3255

Required for Function-Based Indexes

An index on a function's result needs the function to be declared DETERMINISTIC; otherwise the index is refused.

Example:

create or replace function km_to_miles2 (p_km number) return number deterministic is
begin
  return round(p_km / 1.609344);
end;
/
create or replace function km_to_miles_nd (p_km number) return number is
begin
  return round(p_km / 1.609344);
end;
/
-- a function-based index needs a DETERMINISTIC function
create index routes_miles_ix on routes (km_to_miles2(distance_km));
create index routes_miles_nd_ix on routes (km_to_miles_nd(distance_km));

Output:

Function KM_TO_MILES2 compiled

Function KM_TO_MILES_ND compiled

Index ROUTES_MILES_IX created.

Error starting at line : 13
In command -
create index routes_miles_nd_ix on routes (km_to_miles_nd(distance_km))
Error report -
ORA-30553: The function is not deterministic.

The index on the deterministic version is created; the one on the identical but undeclared function fails with ORA-30553. The example drops its functions and index afterward.

Things to Know

  • Within one query, Oracle may reuse a deterministic function's result for repeated arguments, but it does not guarantee it; use RESULT_CACHE to cache across calls and sessions.
  • Virtual columns that call PL/SQL functions also require DETERMINISTIC.
  • If the function's logic changes, rebuild indexes that use it, since stored values were computed with the old logic.

Related Guides

Conclusion

DETERMINISTIC declares that a function's result depends only on its arguments. Use it for pure calculations, where it lets Oracle skip repeated calls and allows the function in function-based indexes and virtual columns, and never for functions that read changing data.

Get more Vinish.dev tutorials on Google

See my articles more often when you search Google.

Vinish Kapoor
Vinish Kapoor

An Oracle ACE, author of four books on Oracle APEX, SQL and PL/SQL, and Oracle Forms, and a software developer building Oracle database applications since 2001.

guest

0 Comments
Oldest
Newest Most Voted