• 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')
  • 相关阅读:
    Entity Framework Core 2.0 新特性
    asp.net core部署时自定义监听端口,提高部署的灵活性
    asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法
    使用xshell连接服务器,数字键盘无法使用解决办法
    使用Jexus 5.8.2在Centos下部署运行Asp.net core
    【DevOps】DevOps成功的八大炫酷工具
    【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别
    【Network】UDP 大包怎么发? MTU怎么设置?
    【Network】高性能 UDP 应该怎么做?
    【Network】golang 容器项目 flannel/UDP相关资料
  • 原文地址:https://www.cnblogs.com/zhangym/p/5473022.html
Copyright © 2020-2023  润新知