Oracle对象类型也有属性和方法.

创建对象类型与创建表很相似,只是实际上不为存储的数据分配空间:

不带方法的简单对象类型:

CREATE TYPE type_name as OBJECT (

column_1 type1,

column_2

type2,

...

);

注意:AS OBJECT

创建好对象类型之后,就可以在创建表的时候,使用该类型了,如:

CREATE TYPE HUMANAS OBJECT(

NAME

VARCHAR2(20),

SEX VARCHAR2(1),-- F : FEMALE M:MALE

BIRTHDAY

DATE,

NOTE VARCHAR2(300)

)

稍后,可以用下面的语句查看:

SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TYPE'

CREATE TABLE STUDENTS(

GUID NUMBER NOT NULL,

STUDENTS HUMAN)

此下省去两个Trigger.

插入数据的时候,可以如下:

INSERT INTO STUDENTS (STUDENT) VALUES (HUMAN('xling','M',TO_DATE('20060101','YYYYMMDD'),'测试'))

注意:HUMAN('xling','M',TO_DATE('20060101','YYYYMMDD'),'测试'),这是个默认的构造函数.

如果想选出性别为女(F)的记录,可以如下:

SELECT * FROM STUDENTS S WHERE S.STUDENT.SEX = 'F'

注意:不能写成:SELECT * FROM STUDENTS WHERE STUDENT.SEX = 'F'

这样会报如下错误:ORA-00904: "STUDENT"."SEX": 标识符无效

对象类型表:每条记录都是对象的表,称为对象类型表.它有两个使用方法:1,用作只有一个对象类型字段的表.2,用作具有对象类型字段的标准关系表.

语法如下:

CREATE TABLE table_name OF object_type;

例如:

CREATE TABLE TMP_STUDENTS OF HUMAN;

用DESC

TMP_STUDENTS,可以看到它的字段结构和HUMAN的结构一样.

对象类型表有两个优点:1,从某种程度上简化了对象的使用,因为对象表的字段类型与对象类型是一致的,所以,不需要用对象名来修饰对象属性,可以把数据插入对象类型表,就像插入普通的关系表中一样:

INSERT INTO TMP_STUDENTS VALUES

('xling','M',TO_DATE('20060601','YYYYMMDD'),'对象类型表');

当然也可用如下方法插入:

INSERT

INTO TMP_STUDENTS VALUES

(HUMAN('snow','F',TO_DATE('20060102','YYYYMMDD'),'用类型的构造函数'));

第二个特点是:对象表是使用对象类型作为模板来创建表的一种便捷方式,它可以确保多个表具有相同的结构.

对象类型表在:USER_TABLES表里是查不到的,而在USER_OBJECTS表里可以查到,而且OBJECT_TYPE = 'TABLE'

类型在定义的时候,会自动包含一个方法,即默认的构造器.构造器的名称与对象的名称相同,它带有变量与对象类型的每个属性相对应.

对象类型的方法:

CREATE TYPE type_name AS OBJECT (

column1 column_type1,

column2

column_type2,

... ,

MEMBER FUNCTION

method_name(args_list) RETURN return_type,

...

)

注意:是MEMBER FUNCTION,(当然,也可是MEMBER PROCEDURE,没有返回值)

和包(PACKAGE)一样,如果对象类型有方法的话,还要声明一个BODY:

CREATE TYPE BODY type_name AS

MEMBER FUNCTION method_name RETURN

return_type {AS | IS}

variable

declareations..

BEGIN

CODE..

RETURN return_value;

END;//END

MEMBER FUNCTION

...

END;//END TYPE BODY

如下所示:

CREATE TYPE HUMAN AS OBJECT(

NAME VARCHAR2(20),

SEX

VARCHAR2(1),-- F : FEMALE M:MALE

BIRTHDAY DATE,

NOTE

VARCHAR2(300),

MEMBER FUNCTION GET_AGE RETURN NUMBER

)

--BODY

CREATE TYPE BODY HUMAN AS

MEMBER FUNCTION GET_AGE RETURN

NUMBER AS

V_MONTHS NUMBER;

BEGIN

SELECT

FLOOR(MONTHS_BETWEEN(SYSDATE,BIRTHDAY)/12) INTO V_MONTHS FROM DUAL;

RETURN

V_MONTHS;

END;

END;

注意:BODY的格式,不是AS OBJECT,也不是用小括号括起来的.MEMBER FUNCTION

后的AS或IS不能省略.

还以STUDENTS表为例(注:如果类型以被某个表使用,是不能修改的,必须把相关的表删除,然后把类型删除,在一个一个新建,这里就省略了,参见前文所述)

SELECT S.STUDENT.GET_AGE() FROM STUDENTS S

在提起注意:表名一定要有别名.GET_AGE()的括号不能省略,否则会提示错误.

下面演示在一个匿名过程中的使用情况:

SET SERVEROUTPUT ON

DECLARE

AA HUMAN;

AGE

NUMBER;

BEGIN

AA :=

HUMAN('xingFairy','M',TO_DATE('19830714','YYYYMMDD'),'过程');

AGE :=

AA.GET_AGE();

DBMS_OUTPUT.PUT_LINE(AGE);

END;

映射方法:

映射方法是一种不带参数,并返回标准的标量Oracle

SQL数据类型的方法,如NUMBER,VARCHAR2,Oracle将间接地使用这些方法执行比较运算.

映射方法最重要的一个特点是:当在WHERE或ORDER

BY等比较关系子句中使用对象时,会间接地使用映射方法.

映射方法的声明只过是在普通方法声明的前面加一个

MAP而以,注意:映射方法是一种不带参数的方法.

MAP MEMBER FUNCTION function_name RETURN

return_type

修改前文提到的HUMAN类型:

--映射方法 MAP

CREATE TYPE HUMAN AS OBJECT(

NAME VARCHAR2(20),

SEX

VARCHAR2(1),-- F : FEMALE M:MALE

BIRTHDAY DATE,--注册日期

REGISTERDAY DATE,

NOTE VARCHAR2(300),

MEMBER FUNCTION

GET_AGE RETURN NUMBER,

MAP MEMBER FUNCTION GET_GRADE RETURN

NUMBER

)

CREATE TYPE BODY HUMAN AS

-----------------------

MEMBER

FUNCTION GET_AGE RETURN NUMBER AS

V_MONTHS NUMBER;

BEGIN

SELECT FLOOR(MONTHS_BETWEEN(SYSDATE,BIRTHDAY)/12) INTO V_MONTHS

FROM DUAL;

RETURN V_MONTHS;

END;

------------------------

MAP MEMBER FUNCTION GET_GRADE RETURN NUMBER

AS

BEGIN

RETURN MONTHS_BETWEEN(SYSDATE,BIRTHDAY);

END;

END;

插入数据:

INSERT INTO STUDENTS (STUDENT) VALUES

(HUMAN('xling','M',TO_DATE('19830714','YYYYMMDD'),TO_DATE('20020915','YYYYMMDD'),

'测试MAP方法'));

INSERT INTO STUDENTS (STUDENT) VALUES

(HUMAN('fairy','M',TO_DATE('19830714','YYYYMMDD'),TO_DATE('20010915','YYYYMMDD'),

'测试MAP方法'));

INSERT INTO STUDENTS (STUDENT) VALUES

(HUMAN('snow','M',TO_DATE('19830714','YYYYMMDD'),TO_DATE('20020915','YYYYMMDD'),

'测试MAP方法'));

在执行上面的操作后,用下面这个SELECT语句可以看出映射方法的效果:

SELECT

S.STUDENT.NAME,S.STUDENT.GET_GRADE() FROM STUDENTS S ORDER BY

STUDENT

它是按MAP方法GET_GRADE()的值进行排序的.注意是ORDER BY

STUDENT,在提起一次需要注意,一定要用表的别名,方法后的括号不能省略,即使没有参数.

如果想以MAP方法的结果为条件,可以如下:

SELECT S.STUDENT.NAME,S.STUDENT.GET_GRADE() FROM STUDENTS S WHERE

S.STUDENT.GET_GRADE() > 50

SELECT S.STUDENT.NAME,S.STUDENT.GET_GRADE()

FROM STUDENTS S WHERE STUDENT >

HUMAN(NULL,NULL,NULL,TO_DATE('20020101','YYYYMMDD'),NULL);

排序方法:

先说一下SELF,Oracle里对象的SELF和JAVA里的this是同一个意思.

对象的排序方法具有一个与对象类型相同的参数,暂称为ARG1,用于和SELF对象进行比较.如果调用方法的SELF对象比ARG1小,返回负值,如果相等,返回0,如果SELF大于ARG1,则返回值大于0.

--映射方法 MAP

CREATE TYPE HUMAN AS OBJECT(

NAME VARCHAR2(20),

SEX

VARCHAR2(1),-- F : FEMALE M:MALE

BIRTHDAY DATE,

REGISTERDAY

DATE,

NOTE VARCHAR2(300),

MEMBER FUNCTION GET_AGE RETURN

NUMBER,

ORDER MEMBER FUNCTION MATCH(I_STUDENT IN HUMAN) RETURN

NUMBER

)

CREATE TYPE BODY HUMAN AS

-----------------------

MEMBER

FUNCTION GET_AGE RETURN NUMBER AS

V_MONTHS NUMBER;

BEGIN

SELECT FLOOR(MONTHS_BETWEEN(SYSDATE,BIRTHDAY)/12) INTO V_MONTHS

FROM DUAL;

RETURN V_MONTHS;

END;

------------------------

ORDER MEMBER FUNCTION MATCH(I_STUDENT IN HUMAN)

RETURN NUMBER AS

BEGIN

RETURN REGISTERDAY -

I_STUDENT.REGISTERDAY;

END;

END;

注意:在声明的时候,ORDER方法的参数类型要和SELF的类型一致.

SET SERVEROUTPUT ON

DECLARE

S1 HUMAN;

S2

HUMAN;

BEGIN

S1 :=

HUMAN('xling',NULL,NULL,TO_DATE('20020915','YYYYMMDD'),NULL);

S2 :=

HUMAN('snow',NULL,NULL,TO_DATE('20010915','YYYYMMDD'),NULL);

IF S1

> S2 THEN

DBMS_OUTPUT.PUT_LINE(S1.NAME);

ELSIF S1 < S2

THEN

DBMS_OUTPUT.PUT_LINE(S2.NAME);

ELSE

DBMS_OUTPUT.PUT_LINE('EQUAL');

END IF;

END;

注意S1 和

S2是怎么比较的.  映射方法具有效率方面的优势,因为它把每个对象与单个标量值联系在一起;排序方法有灵活方面的优势,它可以在两个对象之间进行任意复杂的比较.排序方法比映射方法的速度慢.

oracle 对象类型是什么意思,Oracle对象类型 (转)相关推荐

  1. oracle+视图+图形化,如何利用Object Browser图形化工具提高Oracle开发工作效率(二)对象创建管理篇...

    上一篇我们讲解过有关SQL编写与调试方面的技巧,小编在作图时遗漏了一点,就是Unicode的多语言对应,可以同时显示各种语言不乱码,这是其他工具所不具备的.如图: 下面我们就来说一说如何高效的创建和编 ...

  2. [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)

    原帖由 qingyun 于 2010-6-21 15:44 发表  在写pl/sql的时候,有个很重要的注意点: 比如: begin   update  某个sqlserver的表@dblink名字 ...

  3. sql object_id() 对应oracle,关于ORACLE通过file_id与block_id定位数据库对象遇到的问题引发的思考...

    在ORACLE中,我们可以通过file_id(file#)与block_id(block#)去定位一个数据库对象(object).例如,我们在10046生成的trace文件中file#=4 block ...

  4. oracle查询数据做标记,【学习笔记】Oracle如何使用dbms_shared_pool.markhot标记热对象...

    [学习笔记]Oracle如何使用dbms_shared_pool.markhot标记热对象 时间:2016-10-30 20:17   来源:Oracle研究中心   作者:HTZ   点击: 次 天 ...

  5. Oracle官方并发教程之不可变对象

    原文链接,译文链接,译者:Greenster,校对:郑旭东 一个对象如果在创建后不能被修改,那么就称为不可变对象.在并发编程中,一种被普遍认可的原则就是:尽可能的使用不可变对象来创建简单.可靠的代码. ...

  6. oracle对象不在回收站中,Oracle PURGE子句清除回收站中的对象

    使用PURGE语句从回收站中清除表,索引,已删除的表空间或者整个回收站,并释放与对象关联的所有空间.PURGE语句不能回滚,清除以后也不能恢复. 查询USER_RECYCLEBIN数据字典查阅回收站内 ...

  7. Oracle PURGE子句清除回收站中的对象

    使用PURGE语句从回收站中清除表,索引,已删除的表空间或者整个回收站,并释放与对象关联的所有空间.PURGE语句不能回滚,清除以后也不能恢复. 查询 USER_RECYCLEBIN数据字典查阅回收站 ...

  8. Oracle/MSSQL/Mysql 常用数据库的字段类型及大小

    Oracle/MSSQL/Mysql 常用数据库的字段类型及大小 ORACLE的数据类型 常用的数据库字段类型如下:   字段类型   中文说明   限制条件   其它说明   CHAR  固定长度字 ...

  9. 常见oracle数据类型及其在java中的对应类型

    SQL数据类型 JDBC类型代码 标准的Java类型 Oracle扩展的Java类型 1.0标准的JDBC类型: CHAR java.sql.Types.CHAR java.lang.String o ...

  10. oracle中check约束性别,关于Oracle Check类型约束的导入与启用

    今天有朋友问,Oracle的Check约束在indexfile中是否存在,导入后没有检查到. 我测试了一下,事实证明是可以的,Oracle的Check Constraints可以通过imp,使用ind ...

最新文章

  1. Struts2/WebWork高危漏洞(远程执行任意代码)
  2. Observer模式在J2EE中的实现
  3. 聊聊JVM(九)理解进入safepoint时如何让Java线程全部阻塞
  4. 【MySQL】基于MySQL的SQL核心语法实战演练(二)
  5. 【VMware vSAN 6.6】2.5.硬件部署选项:我们有软硬件项目解决方案
  6. 拳王虚拟项目公社:如何如何打造虚拟自动盈利系统,用虚拟资源实现被动收入?
  7. java 内部类传值_Java 封装(内部类)
  8. 《Systems Performance》阅读笔记及收获
  9. java色_JavaSE是什么
  10. MyBatis-Plus学习
  11. 商务网站建设与维护【7】
  12. cdr添加节点快捷键_CDR快捷键大全
  13. Java编写一个公司员工类
  14. 问题 A: 三角函数计算(python)
  15. 诗歌(8)—梅花二首(其二)
  16. 一切免费的大学视频教程,免费空间和网盘
  17. open小将java下载_OPEN YOUR DREAM_OPEN小将_高音质在线试听_OPEN YOUR DREAM歌词|歌曲下载_酷狗音乐...
  18. C---calloc
  19. 以太坊解析之二——POA共识过程与一些可能的修改方案
  20. display:table-cell布局

热门文章

  1. 《程序员的算法趣题》-(日)增井敏克 Python解题 -- (Q13)
  2. matlab 判断数据类型函数,matlab 分类(判别)函数classify()
  3. 无法写入最后一个_影驰擎 GA-E 16TB SSD评测:3.96TB持续稳定写入,你想要的大容量来了...
  4. Ubuntu(WSL)安装3b1b的manim
  5. [pinyin4j] java版汉字转换拼音(大小写)
  6. 共轭梯度法 (CG) 解线性方程组
  7. Android开发高性能之 (崩溃优化)
  8. 有幸被推荐到首批Oracle YEP计划
  9. vue实例的生命周期详解
  10. 视网膜色素上皮细胞研究最新进展