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; /