22.06.2013

ООП на PL/SQL: введение

В который раз не знаю, что писать в заголовок поста. Ну, давай начнем так: "реализация ООП впервые появилась в РСУБД Oracle 9g".
1. Создаем объектный тип OBJECT_TEST1
create or replace type OBJECT_TEST1 as object (
       id                          number(7),
       name                        varchar2(50),
       effective_start_date        date,
       effective_end_date          date,
       value                       number,
       inc_value                   number,
       value_sign                  number(1),
       constructor function object_test1(
                   p_value  number
                   ) return self as result,
       member function get_inc_value return number,
       member function get_sign_value return number
)
create or replace type body OBJECT_TEST1 as
 constructor function object_test1(
                      p_value number
                   ) return self as result is
 begin
   self.value := p_value;
   self.inc_value := p_value + 1;
   self.value_sign := sign(p_value);
   self.id := object_test1_s.nextval;
   self.effective_start_date := sysdate;
   self.effective_end_date := to_date('31.12.4212', 'DD.MM.YYYY');
   return;
 end object_test1;
 --
 member function get_inc_value return number
 is
 begin
   return self.inc_value;
 end get_inc_value;
 --
 member function get_sign_value return number
 is
 begin
   return self.value_sign;
 end get_sign_value;
end;
2. Создаем таблицу, в которой будут храниться объекты и некоторые вспомогательные штуки вроде последовательности. Обращаем внимание на лаконичный синтаксис описания таблицы, а также на то, что набор полей после создания соответствует набору переменных объектного типа.
create table test1_objects of object_test1
/
create sequence object_test1_s
start with 1
increment by 1
maxvalue 99999999999
nocache
/
3. Создаем API для нашей таблицы.
create or replace package OBJECT_TEST1_PKG is
  procedure insert_object(p_object object_test1);
  procedure update_object(p_old object_test1,
                          p_new object_test1);
  procedure delete_object(p_object object_test1); 
end OBJECT_TEST1_PKG;
create or replace package body OBJECT_TEST1_PKG is
  procedure insert_object(p_object object_test1)
  is
  begin
    insert into test1_objects
    values (p_object);
  end insert_object;
  --
  procedure update_object(p_old object_test1,
                          p_new object_test1)
  is
  begin
    update test1_objects tob
    set tob.name = p_new.name
    where tob.id = p_old.id;
  end update_object;

  procedure delete_object(p_object object_test1)
  is
  begin
    delete from test1_objects tob
    where tob.id = p_object.id;
  end delete_object;
end OBJECT_TEST1_PKG;
4. Используем API
declare
 l_object object_test1;
begin
 l_object := new object_test1(1);
 object_test1_pkg.insert_object(l_object);
end;
Результат:
SQL> select * from test1_objects
  2  /

ID NAME EFFECTIVE_START_DATE EFFECTIVE_END_DATE VALUE INC_VALUE VALUE_SIGN

-- ---- -------------------- ------------------ ----- --------- ---------- 
3       15.06.2013 0:13:24   31.12.4212         1     2         1
SQL> 

Комментариев нет :