zoukankan      html  css  js  c++  java
  • oracle对象类型

    Oracle的对象类型

    对象类型

    在PL/SQL中,面向对象的程序设计师基于对象类型来完成的。对象类型是用户自定义的一种复合数据类型,它封装了数据结构和用于操纵这些数据结构的过程和函数。

    数据库的对象类型与JAVA和C#中德类相似,都可以包含属性(用于存储对象的状态)和方法(用于建立对象的行为模型)。对象类型有时也为用户自定义类型。

    对象类型包括对象类型规范(Object Type Specification)和对象类型体(Object Type Body)两个部分:

    对象类型规范 对象与应用的接口,用于定义对象的公有属性和方法。 对象类型体 用于实现对象类型规范所定义的公有方法。

    创建简单对象类型

    创建简单数据类型的语法如下:

    CREATE [OR REPLACE] TYPE type_name AS OBJECT(
        column_name data_type
        [,column_name data_type,...]
    )

    对象类型属性用于描述对象所具有的特征,每个对象类型至少有一个属性,至多包含1000个属性。属性类型可以是除以下类型外的任何Oracle数据类型(包括对象类型):LONG、LONG RAW、NCHAR、NCLOB、NVARCHAR2、ROWID、UROWID、以及PL/SQL的特定类型%TYPE和%ROWTYPE。

    例1:

    首先赋予用户创建对象的权限:

    GRANT CREATE  ANY  TYPE TO siege;

    然后创建对象:

    CREATE TYPE stu AS OBJECT(
           name VARCHAR2(20),
           sex     VARCHAR2(2),
           birthday DATE,
           note VARCHAR2(300)
    )

    我们也可以将一个对象当作一个普通类型来使用:

    CREATE TYPE stu2 AS OBJECT(
           sid NUMBER(4),
           student stu
    )

    同样,我们可以在创建表的时候使用自定义的类型:

    CREATE TABLE student2(
           sid NUMBER(4),
           student stu
    )

    创建带有函数的对象类型

    创建带有函数的对象类型语法如下:

    CREATE [OR REPLACE] TYPE type_name AS OBJECT(
        column_name data_type
        [,column_name data_type,...],
        member function method_name(args_list) return_type,
        ...
    )

    其中,function表示一个函数,创建对象类型的member语句中,也可以使用member procedure代替member function,只不过不再有返回值。

    如果对象中带有函数,还需要声明一个对象体(BODY),对象体定义了函数的实际代码,其创建语法如下:

    CREATE [OR REPLACE] TYPE BODY type_name AS 
        MEMBER FUNCTION method_name RETURN return_type {AS|IS}
        variable declareations...;
        BEGIN ...
        RETURN return_value;
        END;
    END;
        column_name data_type
        [,column_name data_type,...]
    

    例2:

    首先创建对象类型:

    CREATE TYPE stu3 AS OBJECT(
           name VARCHAR2(20),
           sex     VARCHAR2(2),
           birthday DATE,
           note VARCHAR2(300),
           MEMBER FUNCTION get_age RETURN NUMBER
    )

    然后创建对象体:

    CREATE TYPE BODY stu3 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; 

    然后我们创建student3表:

    CREATE TABLE student3(
           sid NUMBER(4),
           student stu3
    )   

    现在插入一条数据:

    INSERT INTO student3 VALUES(1,stu3('siege','M',TO_DATE('19910228','YYYYMMDD'),'my notes'));

    现在我们查询刚才插入的语句:

    SELECT s.sid,s.student.name,s.student.sex,s.student.birthday,s.student.note,s.student.get_age() FROM student3 s

    其结果如下:

    SID STUDENT.NAME STUDENT.SEX STUDENT.BIRTHDAY STUDENT.NOTE S.STUDENT.GET_AGE() 
    1 siege M 28/02/1991 my notes 24

    获取对象类型信息

    在使用对象类型之前,需要明确对象类型的结构(主要包括属性的数据类型和数据范围),查看对象的结构可以使用DESCRIBE命令。

    在PL/SQL developer的command window打开一个窗口,输入如下语句来设置信息深度:

    SET DESCRIBE [DEPTH {1|n|ALL}]

    深度的取值范围为1-50,默认值为1。深度表示对象的层次,类似JAVA中包的层次,本例中STU2的深度为2

    DESCRIBE STU2;

    即可查询对象类型的信息了。

    列对象

    列对象(COLUMN OBJECT)使用对象类类型定义单个的列,存储在此列中的对象成为列对象。

    如果只需要使用对象类型来定义表中的单个列,可以使用列对象的形式。使用列对象的方式是在创建表时,将列的数据类型定义为对象类型。

    语法如下:

    column_name type_name

    向包含列对象的表中添加数据时,必须使用构造函数为列对象提供属性值。

    对象表

    对象表(OBJECT TABLE)使用对象类型定义表中的一整行,此表被称为对象表。

    如果需要使用对象类型来定义整个表,那么可以将整个表创建为对象表。使用OF子句将表标识为对象表,其语法如下:

    CREATE TABLE table_name OF type_name;

    向对象表中添加纪录时,可以有以下两种方式:

    通过构造函数提供属性值

    在关系表中提供列值

    例3:

    CREATE TABLE student4 OF stu;

    此时就创建好了对象表student4 。

    通过构造函数向表中添加数据:

    INSERT INTO student4 VALUES(stu('siege','M',TO_DATE('19910228','YYYYMMDD'),'NOTHING'));

    通过向普通表中添加数据的方法:

    INSERT INTO student4 VALUES('cage','M',TO_DATE('19910228','YYYYMMDD'),'NOTHING')

    对象表的查询除了可以使用一般的查询语句,还可以使用value函数:

    SELECT  value(s) FROM student4 s

    也可以单独查询某一列或几列:

    SELECT VALUE(s).sex FROM student4 s

    对象标识符和对象引用

    对象表中的每个对象都具有惟一的对象标识符(OBJECT IDENTIFIER,OID),它可以存储在名称为REF的列中。对象引用使用REF类型进行定义,通常都可以用作指向对象表中对象的指针,可以使用对象引用为对象表之间的关系建立模型,而不是使用外键。

    使用REF()函数来检索对象的OID。

    例4:

    SELECT REF(s) FROM student4 s

    其结果:

    REF(S) 
    000028020928DFC3EBA9874580B244E5CDEBF8F899401875D0C7E041528E5969734EB8E5B5014000F50000
    0000280209AFF154978FF84383BAFDD806C52FD6F3401875D0C7E041528E5969734EB8E5B5014000F50001

    这一长串数字和字母的组合就是OID,它标识数据库中对象的位置。可以将OID存储在一个对象引用中,通过它就可以访问它引用的对象。

    可以使用对象引用为对象表之间的关系建立模型。使用REF类型来定义一个对象引用。语法如下:

    CREATE TABLE table_name(
        ref_name REF type_name SCOPE IS table_type_name
    );

    其中,SCOPE IS子句将对象引用限制在特定表中的对象上。

    例5:

    CREATE TABLE student_object_ref(
           ID NUMBER(4),
           stu_ref REF stu SCOPE IS student4
    )

    插入两条数据:

    INSERT INTO student_object_ref(id,stu_ref) VALUES
    (1,(SELECT REF(s) FROM student4 s WHERE s.name='siege'));
    INSERT INTO student_object_ref(id,stu_ref) VALUES
    (2,(SELECT REF(s) FROM student4 s WHERE s.name='cage'))

    查询结果:

        ID  STU_REF
        1   000022020828DFC3EBA9874580B244E5CDEBF8F899401875D0C7E041528E5969734EB8E5B5
        2   0000220208AFF154978FF84383BAFDD806C52FD6F3401875D0C7E041528E5969734EB8E5B5
    

    现在我们通过DEREF函数来查询结果:

    SELECT DEREF(stu_ref) FROM student_object_ref

    其结果如下:

    DEREF(STU_REF).NAME DEREF(STU_REF).SEX  DEREF(STU_REF).BIRTHDAY DEREF(STU_REF).NOTE
    siege   M   28/02/1991  NOTHING
    cage    M   28/02/1991  NOTHING
    

    此时不再显示标识符,而是对象引用对应的数据。我们可以通过对象引用来进行数据查询:

    SELECT id,DEREF(stu_ref).name,DEREF(stu_ref).sex,DEREF(stu_ref).note FROM student_object_ref

    我们也可以对对象引用进行更改:

    UPDATE student_object_ref SET stu_ref=(SELECT REF(s) FROM student4 s WHERE s.name='cage')
  • 相关阅读:
    eclipse中打断点debug无效
    Jenkins构建部署Maven项目
    自动生成实体类和xml
    session 控制单点登录
    eclipse team 没有svn
    easyui combobox 设置滚动条
    unkow jdbc driver : http://maven.apache.org
    easyui datagrid列显示图片
    mysql中计算日期整数差
    Map<String, Object>转Object,Object转 Map<String, Object>
  • 原文地址:https://www.cnblogs.com/zhangym/p/5473022.html
Copyright © 2011-2022 走看看