Sql 在表中保存oracle对象

Sql 在表中保存oracle对象,sql,oracle,oop,plsql,oracle11g,Sql,Oracle,Oop,Plsql,Oracle11g,我在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

我在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;
结果是:


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

这不是oracle行为,PL/SQL developer帮助您理解存储在表中的信息,例如,当我使用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从ttt中选择treatt.person作为person.name p People不使用表中的对象,只是因为它在sqlplus*中很难看:不确定。我没有说,我告诉他,他的结论是基于他使用的工具,我向他展示了SQL*Plus以自己的方式显示这些数据,person.id和person.name没有物理列。是的,person.id和person.name实际上有物理列。但当您选择它们时,需要使用一个表别名,如从ttt中选择t.person.id;这是有案可查的。在Oracle中创建对象表确实会在后台创建关系表。问题是您对关系的控制较少,主键/外键是通过系统创建的列来完成的。我喜欢以关系方式手动创建表和数据模型,然后如果需要OOP访问和编程,我会在关系表的顶部创建一个对象视图t@KimBergHansen谢谢,我不知道。