使用对象类型

来源:互联网 发布:程序员接单知乎 编辑:程序博客网 时间:2024/04/30 12:56

<!-- /* Font Definitions */ @font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:"/@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-parent:"";margin:0cm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;mso-pagination:none;font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:"Times New Roman";mso-fareast-font-family:宋体;mso-font-kerning:1.0pt;} /* Page Definitions */ @page{mso-page-border-surround-header:no;mso-page-border-surround-footer:no;}@page Section1{size:595.3pt 841.9pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;mso-header-margin:42.55pt;mso-footer-margin:49.6pt;mso-paper-source:0;layout-grid:15.6pt;}div.Section1{page:Section1;} /* List Definitions */ @list l0{mso-list-id:174615601;mso-list-type:hybrid;mso-list-template-ids:-331832914 159668954 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}@list l0:level1{mso-level-tab-stop:18.0pt;mso-level-number-position:left;margin-left:18.0pt;text-indent:-18.0pt;}@list l1{mso-list-id:1033309494;mso-list-type:hybrid;mso-list-template-ids:-1424110 122832736 274911138 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}@list l1:level1{mso-level-tab-stop:18.0pt;mso-level-number-position:left;margin-left:18.0pt;text-indent:-18.0pt;}@list l1:level2{mso-level-tab-stop:39.0pt;mso-level-number-position:left;margin-left:39.0pt;text-indent:-18.0pt;}ol{margin-bottom:0cm;}ul{margin-bottom:0cm;}-->

使用对象类型

一:对象类型的属性。对象类型不能实用的数据类型:

LONG and LONG RAW

ROWID and UROWID

PL/SQL:特有类型

二:对象类型方法

1.      构造方法:用于初始化对象并返回对象实例。

2.      MEMBER方法:用于访问对象实例的数据。使用MEMBER方法的时,可以使用内置参数SELF访问当前对象实例。

3.      STATIC方法:用于在对象类型上执行全局操作,只能由对象类型调用。

4.      MAP方法(可选):将对象实例映射为标量类型数据(NUMBERVARCHAR2DATE),然后根据标量类型数据排序对象实例。但最多只能定义一个MAP方法。

5.      ORDER方法

只能比较两个对象实例的大小。但最多只能定义一个MAP方法。MAP方法和ORDER方法不能同时定义。

三:建立对象类型。包括对象类型规范,对象类型体。

1.      建立MAP方法

CREATE OR REPLACE TYPE person_typ4 AS OBJECT (

  2 name VARCHAR2(10),gender VARCHAR2(2),birthdate DATE,

  3 MAP MEMBER FUNCTION getage RETURN VARCHAR2

  4 );

  5  /

 

CREATE OR REPLACE TYPE BODY person_typ4 IS

  2 MAP MEMBER FUNCTION getage RETURN VARCHAR2

  3 IS

  4  BEGIN

  5    RETURN TRUNC((SYSDATE-birthdate)/365);

  6  END;

7  END;

trunc实际上是truncate函数,字面意思是截断。

2. 如果建立ORDER函数

CREATE OR REPLACE TYPE person_typ5 AS OBJECT (

name VARCHAR2(10),gender VARCHAR2(2),birthdate DATE,

ORDER MEMBER FUNCTION compare(p person_typ5) RETURN VARCHAR2

) ;

CREATE OR REPLACE TYPE BODY person_typ5 IS

  2 ORDER MEMBER FUNCTION compare(p person_typ5) RETURN INT

  3 IS

  4  BEGIN

  5    CASE

  6      WHEN birthdate > p.birthdate THENRETURN 1;

  7      WHEN birthdate = p.birthdate THEN RETURN0;

  8      WHEN birthdate < p.birthdate THENRETURN -1;

  9    END CASE;

 10 END;

 11  END;

3.建立构造函数

CREATE OR REPLACE TYPE person_type6 AS OBJECT(

name VARCHAR2(10),gender VARCHAR2(2),birthdate DATE,

CONSTRUCTOR FUNCTION person_typ6(name VARCHAR2)

RETURN SELF AS RESULT);

 

CREATE OR REPLACE TYPE BODY person_typ6 IS

  2 CONSTRUCTOR FUNCTION person_typ6(name VARCHAR2)

  3  RETURN SELF AS RESULT

  4 IS

  5 BEGIN

  6  self.name:=name;

  7  self.gender:='';

  8  self.birthdate:=SYSDATE;

  9  return;

 10 END;

 11  END;

 

四:使用引用数据

CREATE TABLE employee_tab8(

eno NUMBER(6),person REF person_typ8,

sal NUMBER(6,2),job VARCHAR2(10)

)

1.插入数据

BEGIN

INSERT 1,REF(a),2000,'图书管理员' FROM person_tab8a

WHERE a.name='马丽';

END;

REF(a)返回指向相应数据行的指针。

2.    检索数据

DECLARE

  2  v_person person_typ8;

  3 BEGIN

  4  SELECT DEREF(person) INTO v_personFROM employee_tab8

  5   WHERE eno=&no;

6 dbms_output.put_line(v_person.get_info);

7  END

DEREF(person)取得行对象的相应数据。

3.   更新REF对象列数据

 

 

DECLARE

  2 v_person person_typ8;

  3 BEGIN

  4  SELECT DEREF(person) INTO v_person FROM employee_tab8

  5    WHERE eno=&no;

  6  UPDATE person_tab8 SET address=v_person.address

  7    WHERE name=v_person.name;

  8 END;

五:对象类型的继承

当使用对象类型继承时,在定义父类型时必须要指定NOT FINAL;因为默认情况下为FINAL 表示该对象类型不能被继承。

CREATE OR REPLACE TYPE person_typ9 AS OBJECT(

name VARCHAR2(10),gender VARCHAR2(2),

birthdate DATE,address VARCHAR2(50),

MEMBER FUNCTION get_info RETURN VARCHAR2

)NOT FINAL;

CREATE OR REPLACE TYPE employee_typ9 UNDER person_typ9(

eno NUMBER(6),sal NUMBER(6,2),job VARCHAR2(10),

MEMBER FUNCTION get_other RETURN VARCHAR2);

 

六:管理对象类型

1.执行CREATE TYPE命令建立对象类型时,ORACLE 会将对象类型的信息存放到数据字典中。通过查询数据字典视图USER_TYPES.

SELECT type_name,attribute,final FROM user_types;

2.   增加对象类型属性。为对象增加或删除属性时必须要带上CASCADE

ALTER TYPE person_typ1 ADD ATTRIBUTE

Address VARCHAR2(50) CASCADE;

 

ALTER TYPE person_typ1 DROP ATTRIBUTE birthdate CASCADE;

 

ALTER TYPE person_typ1

ADD MEMBER FUNCTION get_info RETURN VARCHAR2

CASCADE;

原创粉丝点击