• oracle:对象(object)操作


    创建对象类型

    CREATE TYPE object_type AS OBJECT(
    column_name type,
    [column_name type,]
    [MEMBER FUNCTION fun_name RETURN type]
    [MEMBER PROCEDURE proc_name ]
    );

     其中MEMBER FUNCTION 声明了对象内部函数,MEMBER PROCEDURE 声明了内部过程,添加对象体(body)

    CREATE TYPE BODY object_type AS
      MEMBER FUNCTION fun_name RETURN type IS
        var_name type;
      BEGIN
        NULL;
      END;
    END;
    /

    获取有关对象类型的信息

    DESC[RIBE] object_type;

    如果对象是嵌套对象,可以通过设定深度来输出子对象,下面是输出两级的。

    SET DESCRIBE DEPTH 2
    DESC[RIBE] object_type;

     使用对象类型定义列和对象表

    CREATE TABLE table_name(
    column_name type,
    column_name1 object_type
    );

     上面的 object_type 是通过之前的对象类型定义而来的。

    CREATE TABLE object_tab_name OF object_type;

     上面定义的表跟普通的创建表没有太大的分别(可能)。

    对象引用和对象标示符

    对象表的另一一个不同之处在于可以使用对象引用(object reference)为对象表之间的关系建立模型,而不使用外键达到外键的效果。

     使用REF类型进行定义,通常用作指向对象表中对象的指针。

    CREATE TABLE table_name(
    column_name type,
    obj_col_name REF object_type SCOPE IS obj_tab_name);

     如果 obj_tab_name 表已经存在,则可以不写 SCOPE IS obj_tab_name

    注意:obj_tab_name 是用 object_type 创建的对象表

    向包含对象属性的表插入数据

    INSERT INTO table_name(
    column_name, obj_col_name)
    VALUES(
    'xx',object_type('xx','xx','xx) );
    
    or
    
    INSERT INTO table_name(
    column_name,obj_col_name)
    VALUES(
    x,
    (SELECT REF(T) FROM obj_tab_name T WHERE T.col=x) );

    下面那个是通过直接插入标识符,数据已经存在了对象表obj_tab_name 中,REF() 是获得对象的标识符,

    查找数据的时候,object_tpye 中的全部数据会合成一个数据输出,就是列名下面是很长的一个下划线,没有断开

    要用对象中的某个属性作为查找条件

    SELECT *
    FROM table_name T
    WHERE T.obj_col_name.column_name= xx;

    对对象表的DML操作

    插入数据

    INSERT INTO obj_tab_name VALUES(
    object_type(x,xx,xxx,xxxx));
    
    INSERT INTO object_tab_name 
    (column_name1,column_name2)
    VALUES(
    x,xx);

    两种方法一样的。

    从对象表中选择数据

    SELECT *
    FROM obj_tab_name;

    这样得出的结果跟普通表一样,每个列分开。

    SELECT VALUE(T)
    FROM obj_tab_name T;

    这样得出的结果跟查找包含对象类型的表,的查找结果一样,全部数据合并成一样。

    类型继承 NOT FINAL

    CREATE TYPE obj_par_name AS OBJECT(
    column_name type
    )NOT FINAL;
    CREATE TYPE obj_chi_name UNDER obj_par_name(
    column_name1 type
    );

    NOT INSTANTIABLE对象类型

    可以防止创建该类型的对象实例。

    CREATE TYPE object_name AS OBJECT(
    column_name type
    )NOT FINAL NOT INSTANTIABLE;

     NOT INSTANTIABLE 对象不能为 FINAL, 所以和NOT FINAL 一起用。

     自定义构造函数

    CREATE OR REPLACE TYPE object_name AS OBJECT(
    column_name type,
    CONSTRUCTOR FUNCTION fun_name(
    column_name1 NUMBER,
    column_name2 VARCHAR2
    )RETURN SELF AS RESULT,
    CONSTRUCTOR FUNCTION fun_name(
    column_name1 NUMBER,
    column_name2 VARCHAR2
    column_name3 NUMBER
    )RETURN SELF AS RESULT
    );
    /

    上面的对象包含两个构造函数,注意是同名的,在调用类型是会自动按属性来匹配

    CREATE OR REPLACE TYPE BODY object_name AS
      CONSTRUCTOR FUNCTION fun_name(
        p_name1 NUMBER,
        p_name2 VARCHAR2
      )RETURN SELF AS RESULT IS
      BEGIN
        SELF.column_name1 :=p_name1;
        SELF.column_name2 :=p_name2;
        SELF.column_name3 :=default_val;
      RETURN ;
      END;
    
      CONSTRUCTOR FUNCTION fun_name(
        p_name1 NUMBER,
        p_name2 VARCHAR2,
        p_name3 NUMBER
      )RETURN SELF AS RESULT IS
      BEGIN
        SELF.column_name1 :=p_name1;
        SELF.column_name2 :=p_name2;
        SELF.column_name3 :=P_name3;
      RETURN ;
      END;
    END;
    /
  • 相关阅读:
    网页打开本地exe程序
    【JS】最简单的域名防红方法,QQ/微信打开网站提示浏览器打开
    【HTML】建站成功默认页面
    python中日志器的使用
    python中连接mysql
    python中处理配置文件
    接口实战项目总结上
    布隆过滤器和LRU Cache
    Python版常见的排序算法
    LeetCode 27. 移除元素
  • 原文地址:https://www.cnblogs.com/Azhu/p/2451072.html
Copyright © 2020-2023  润新知