René Nyffenegger's collection of things on the web | |
René Nyffenegger on Oracle - Most wanted - Feedback
- Follow @renenyffenegger
|
Object Oriented Oracle, example 2 | ||
Oracle has OO capabilities. This example tries to show how to create Object types derive from them and insert/select
instances from/to tables.
First, the base type is created. All methods are not instantiable, so, not type bode will have to be created.
create or replace type math_type as object ( num number(4), not instantiable member function func(n number) return number, not instantiable member function oper return varchar2 ) not instantiable not final; /
Then, a adding type is derived from math_type.
create or replace type add_type under math_type ( overriding member function func(n number) return number, overriding member function oper return varchar2 ) instantiable final; / create or replace type body add_type as overriding member function func(n number) return number is begin return n + num; end; overriding member function oper return varchar2 is begin return '+'; end; end; /
A multiplying type is created. The type's specification (except its name) looks exactly like add_type's:
create or replace type mult_type under math_type ( overriding member function func(n number) return number, overriding member function oper return varchar2 ); / create or replace type body mult_type as overriding member function func(n number) return number is begin return n * num; end; overriding member function oper return varchar2 is begin return '*'; end; end; /
A table with the base type and a number as attributes is created:
create table t_(m math_type, o number(3));
In order to fill the table, two derived types are created and inserted:
declare a add_type := add_type (49); m mult_type := mult_type(15); begin insert into t_ values(a, 100); insert into t_ values(m, 10); end; /
This is now the fun part: the select statement. Note that depending on
the previously inserted type a different func(..) and oper(..)
are executed:
column oper format a1 column num format 999999 select t.o o, t.m.oper() oper, t.m.num num, '=' eq, t.m.func(t.o) res from t_ t;
Here's the resulting output:
O O NUM E RES ---------- - ---------- - ------- 100 + 49 = 149 10 * 15 = 150
Cleaning up...
drop table t_; drop type add_type; drop type mult_type; drop type math_type; |