【问题标题】:Save oracle objects in tables在表中保存 oracle 对象
【发布时间】:2014-08-13 10:52:19
【问题描述】:

我读过 Oracle 中的 OOP。做了一些将对象插入表格的练习。 例如:

create or replace type person as object(
 id number,
 name varchar2(50),
 age number,
 constructor function person return self as result,
 constructor function person(id number, name varchar2, age number) return self as result,
 member procedure set_id(id in number),
 member function get_id return number,
 member procedure set_name(name in varchar2),
 member function get_name return varchar2,
 member procedure set_age(age in number),
 member function get_age return number,
 member function to_string return varchar2
)

正文:

create or replace type body person as
 constructor function person return self as result is
  begin
    self := person();
    return;
  end;

 constructor function person(id in number, name in varchar2, age in number) return self as result is
  begin
    self.id := id;
    self.name := name;
    self.age := age;
    return;
  end;


 member procedure set_id(id in number) is
  begin
    self.id := id;
  end;

 member function get_id return number is
  begin 
    return self.id;
  end;

 member procedure set_name(name in varchar2) is
  begin
    self.name := name;
  end;

 member function get_name return varchar2 is
  begin
    return self.name;
  end;


member procedure set_age(age in number) is
 begin
   self.age := age;
 end;

member function get_age return number is
 begin
   return self.age;
 end;

member function to_string return varchar2 is
 begin
   return 'Person={id='||self.get_id||', name='||self.get_name||', age='||self.get_age||'}';
 end;

end;

创建一些表:

create table test_objs(
 id number,
 person person
)

还有一些 DML:

insert into test_objs(id, person) values(1, person(1, 'Test person', 25));

select * from test_objs;

结果是:

对我来说看起来很棒,最好使用对象而不是过程/函数中的几个参数(恕我直言)。 Oracle 有很好的 OOP(如果他们也添加封装,那就太棒了)。我创建对象,将这些对象保存在表中,创建与对象一起使用的存储程序等等。但我没有看到任何人将数据作为对象保存或在数据库级别进行完全 oop。专家建议这种数据库编程方式吗?它的优缺点是什么?

【问题讨论】:

    标签: sql oracle oop plsql oracle11g


    【解决方案1】:

    这不是 oracle 的行为,PL/SQL 开发者帮助你理解你存储在表中的信息,例如当我使用 SQL*Plus 时,我可以看到:

    SQL> conn hr/hr
    Connected.
    SQL> create type person as object (
      2    id number(10),
      3    name varchar2(20 char)
      4  );
      5  /
    
    Type created.
    
    SQL> drop table ttt;
    
    Table dropped.
    
    SQL> create table ttt (
      2    person person
      3  );
    
    Table created.
    
    SQL> insert into ttt values (person(1, 'somename'));
    
    1 row created.
    
    SQL> select * from ttt;
    
    PERSON(ID, NAME)
    -----------------------------------------------------
    PERSON(1, 'somename')
    
    SQL> select person.id from ttt;
    select person.id from ttt
           *
    ERROR at line 1:
    ORA-00904: "PERSON"."ID": invalid identifier
    

    如您所见,SQL*Plus 不会将person 列拆分为多个列,而是将其显示为一个完整的对象。

    人们不使用它,因为:

    • 管理关系模型比管理对象模型更容易。
    • 关系模型更容易构建 SQL 查询。您不需要其他函数来提取价值。

    【讨论】:

    • 但是我们可以这样做: \n select treat(t.person as person).name p from ttt t 人们不使用表中的对象仅仅是因为它在 sqlplus* 中很难看? :) 不确定。
    • 我没有这么说,我告诉他,他的结论是基于他使用的工具,我向他展示了 SQL*Plus 以自己的方式显示这些数据并且没有物理列对于 person.id 和 person.name。
    • 是的,person.id 和 person.name 实际上有物理列。但是当您选择它们​​时,您需要使用表别名,如“select t.person.id from ttt t;”这是记录在案的。在 Oracle 中创建对象表确实会在“幕后”创建关系表。 “麻烦”是您对关系的控制较少,并且主/外键是使用系统创建的列完成的。我喜欢以关系的方式手动创建表和数据模型,然后如果我需要 OOP 访问和编程,我将在我的关系表之上创建一个对象视图。
    • 顺便在sql*plus中也可以这样写:select t.person.id from t
    • @KimBergHansen 谢谢,我不知道。
    猜你喜欢
    • 2020-03-03
    • 2011-05-22
    • 2013-04-10
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多