对象表

网友投稿 822 2022-11-08

对象表

对象表

1、创建父类型

create or replace type person as object ( NAME varchar2 ( 10 ), SEX char ( 2 ), BIRTHDATE date , PLACE varchar2 ( 100 ), member function get_name return varchar2 ) not final ; -- 必须注明,默认为 final create or replace type body person is member function get_name return varchar2 is begin return self.name; end get_name; end ;

2、创建person的子类

create or replace type employee under person ( emp_id varchar2 ( 10 ), dep_id varchar2 ( 10 ), job varchar2 ( 20 ) );

3、应用父类和子类

declare person_one person; employee_one employee; begin person_one:=person( ' 李四 ' , ' 男 ' , date '2008-10-20' , ' 上海 ' ); employee_one:=employee( ' 小张 ' , ' 女 ' , date '2008-10-11' , ' 杭州 ' , '123456' , null , null ); dbms_output.put_line(person_one.get_name); dbms_output.put_line(employee_one.get_name); end ;

注:与其他OOP一样,子类继承父类的参数及函数,但注意子类的参数顺序,都在父类之后顺序排列。 4、父类可引用子类实例:

declare person_one person; employee_one employee; begin person_one:=employee( ' 小张 ' , ' 女 ' , date '2008-10-11' , ' 杭州 ' , '123456' , null , null ); -- 正确! employee_one:=person( ' 李四 ' , ' 男 ' , date '2008-10-20' , ' 上海 ' ); -- 错误,子类不可引用父类实例! dbms_output.put_line(person_one.name); -- 正确! dbms_output.put_line(person_one.emp_id); -- 错误,父类忽略子类参数! end ;

重写 1、建立父类

create or replace type person as object ( NAME varchar2 ( 10 ), SEX char ( 2 ), BIRTHDATE date , PLACE varchar2 ( 100 ), member procedure show_msg ) not final ; create or replace type body person is member function show_msg return varchar2 is begin dbms_output.put_line( name || '/' ||sex|| '/' ||birthdate); end show_msg; end ;

2、创建子类

create or replace type employee under person ( emp_id varchar2 ( 10 ), dep_id varchar2 ( 10 ), job varchar2 ( 20 ), overriding member procedure show_msg--关键字overriding ); create or replace type body employee is overriding member procedure show_msg is begin dbms_output.put_line(emp_id|| '/' ||dep_id|| '/' ||job); end show_msg; end ;

3、重写方法的调用 declare person_one person; employee_one employee; begin person_one:=person( ' 李四 ' , ' 男 ' , date '2008-10-20' , ' 上海 ' ); employee_one:=employee( ' 小张 ' , ' 女 ' , date '2008-10-11' , ' 杭州 ' , '123456' , '11' , '22' ); person_one.show_msg; -- 李四 / 男 /20-OCT-08 employee_one.show_msg; --123456/11/22 end ; 4、类多态 declare person_one person; person_two person; begin person_one:=person( ' 李四 ' , ' 男 ' , date '2008-10-20' , ' 上海 ' ); person_two:=employee( ' 小张 ' , ' 女 ' , date '2008-10-11' , ' 杭州 ' , '123456' , '11' , '22' ); person_one.show_msg; -- 李四 / 男 /20-OCT-08 person_two.show_msg; --123456/11/22 end ; 对象表 要区分对象表和将对象作为字段的表。 对象表是基于对象类型创建的表,对象表的每一行都代表一个对象。 1、创建对象表 create or replace type person as object

( NAME varchar2 ( 10 ), SEX char ( 2 ), BIRTHDATE date , PLACE varchar2 ( 100 ) ) ;

create table t_person of person; -- 注意格式! 2、插入数据(2种方法) insert into t_person values ( ' 张三 ' , ' 男 ' , date '2008-10-11' , ' 杭州 ' ); -- 直接插入 insert into t_person values (person( ' 李四 ' , ' 男 ' , date '2008-10-20' , ' 上海 ' )); -- 插入实例 注:其实第一种方法是由系统隐式创建了对象实例,然后插入 3、查询数据(2种方法) SQL > select * from t_person; NAME SEX BIRTHDATE PLACE -------- ---- --------- -------- 张三 男 11 -OCT- 08 杭州 李四 男 20 -OCT- 08 上海 SQL > select value (a) from t_person a; VALUE (A)( NAME , SEX, BIRTHDATE, PLACE) ---------------------------------------- PERSON( ' 张三 ' , ' 男 ' , '11-OCT-08' , ' 杭州 ' ) PERSON( ' 李四 ' , ' 男 ' , '20-OCT-08' , ' 上海 ' ) 对象表外键 1、对象表之间外键通过REF指针实现创建,首先创建外部表 create table t_person_f( emp_id integer , emp_msg ref person scope is t_person ); 注1:定义字段emp_msg为person对象类型的ref指针 注2:scope表示实例来源,只能从表t_person中获取 2、向外部表中插入数据 insert into t_person_f select 123 , ref (a) from t_person a where a.name= ' 张三 ' ; 注:必须使用select语句通过ref获取实例 3、查询外部表,通过deref来解析 SQL > select * from t_person_f; -- 无法查询真实信息 EMP_ID EMP_MSG ---------- ---------------------------------------------- 123 0000220208 C 5A 9B48F328840D7BF1B44EA41B24A11F8 SQL > select emp_id, deref (emp_msg) from t_person_f; EMP_ID DEREF (EMP_MSG)( NAME , SEX, BIRTHDATE, PLACE) --------- ------------------------------------------------- 123 PERSON( ' 张三 ' , ' 男 ' , '11-OCT-08' , ' 杭州 ' ) 4、外键管理 对象表要求外键引用的行必须存在,而ref则没有这个限制,删除时会指向空值,解析为NULL。 delete from t_person where name = ' 张三 ' ; -- 删除对象 SQL > select emp_id,deref(emp_msg) from t_person_f; EMP_ID DEREF(EMP_MSG)(NAME, SEX, BIRTHDATE, PLACE) --------- ------------------------------------------------- 123 可以使用dangling关键字,查询所有被悬空的ref SQL > select emp_id from t_person_f where emp_msg is dangling ; EMP_ID ---------- 123

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于Mybatis动态sql中test的坑点总结
下一篇:rac静默安装的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~