René Nyffenegger's collection of things on the web | |
René Nyffenegger on Oracle - Most wanted - Feedback
- Follow @renenyffenegger
|
not final [Oracle PL/SQL] | ||
The
not final clause can either be specified for an object type, for a
member procedure/function or for a
static member.
not final object types
A final object type is a type from which cannot be derived
Here's a final and a non-final type:
create type this_type_is_NOT_final as object ( foo number, member function mult(p in number) return number ) not final; / create type this_type_IS_final as object ( foo number, member function mult(p in number) return number ) final; /
Here are their type bodies:
create or replace type body this_type_is_NOT_final as member function mult(p in number) return number is begin return foo * p; end mult; end; / create or replace type body this_type_IS_final as member function mult(p in number) return number is begin return foo * p; end mult; end; / Trying to derive
The following type can be derived because the base type is not final.
create or replace type derived_from_NOT_final under this_type_is_NOT_final ( member procedure bar ); /
The following type can not be derived because the base type is final.
create or replace type derived_from_FINAL under this_type_IS_final ( member procedure bar ); /
Trying to derive from a final type gives a PLS-00590: attempting to create a subtype UNDER a FINAL type.
not final member procedures/functions
Here's a type with a final and a non-final member function:
create type some_base_type as object ( foo number, not final member function NOT_FINAL_func(p in number) return number, final member function FINAL_func (p in number) return number ) not final; /
Here is it's body:
create or replace type body some_base_type as final member function FINAL_func(p in number) return number is begin return foo + p; end FINAL_func; not final member function NOT_FINAL_func(p in number) return number is begin return foo - p; end NOT_FINAL_func; end; / Trying to derive and override
A member function (or procedure) can be overriden if it is declared not final in the base class
(which is the case here):
create or replace type some_derived_type_1 under some_base_type ( overriding member function NOT_FINAL_func(p in number) return number ); /
The following does not work because final member functions (or procedures) cannot be overriden:
create or replace type some_derived_type_2 under some_base_type ( overriding member function FINAL_func(p in number) return number ); /
It results in a PLS-00637: FINAL method cannot be overriden or hidden.
|