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')
oracle对象类型的更多相关文章
- [转]在.Net中使用Oracle的表类型和对象类型
本文转自:http://www.cnblogs.com/studyzy/archive/2010/10/13/1850161.html 在一般的数据存取操作过程中,如果要对一个主表和对应的子表进行插入 ...
- 转载:oracle 自定义类型 type / create type
标签:type create oracle object record 一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarc ...
- oracle type类型
转载 http://blog.sina.com.cn/s/blog_6cfb6b090100ve92.html 转自网络,具体用法我会再细化 1.概念 方法:是在对象类型说明中用关键字 MEM ...
- oracle 自定义类型 type / create type
一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integ ...
- oracle中使用impdp数据泵导入数据提示“ORA-31684:对象类型已经存在”错误的解决
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/47448751 本文出自[我是干勾鱼的博客] oracle中使用impdp数据泵导 ...
- JS 之Blob 对象类型
原文 http://blog.csdn.net/oscar999/article/details/36373183 什么是Blob? Blob 是什么? 这里说的是一种Javascript的对象类型. ...
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- oracle字段类型
oracle 字段类型CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 byt ...
- Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么 ...
随机推荐
- ds.Merge 与 ds.Tables[0].Merge 的用法
DataSet ds = new DataSet(); SqlConnection conn = new SqlConnection(ConnectionStr); SqlCom ...
- JAVA基础知识之网络编程——-使用Proxy创建连接
在前面的HTTP网络通信的例子中,使用了URLConnection conn = url.openConnection();连接网络, 如果改用URLConnection conn = url.ope ...
- hdu 2837 坑题。
Calculation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- WPFのTopMost属性的应用
最近做一个东西,需要用到多个子窗体层级关系,首先,有一个MainWindow,然后有一个win1和win2甚至更多,我需要达到的控制是,win1选为focus的时候,win2在win1的上面,TopM ...
- 2016年11月14日 星期一 --出埃及记 Exodus 20:5
2016年11月14日 星期一 --出埃及记 Exodus 20:5 You shall not bow down to them or worship them; for I, the LORD y ...
- IIS与Apache共用80端口方法[试用成功]
然后假设apache服务器已经安装完成,打开httpd.conf配置文件,找到这些地方去掉#开启代理模块: LoadModule proxy_module modules/mod_proxy.so L ...
- 编译android源码官方教程(3)下载代码
https://source.android.com/source/downloading.html Downloading the Source IN THIS DOCUMENT Installin ...
- AJAX和jQuery Ajax总结
AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用,改善用户体验,实现无刷新效果的技术. 使用AJAX的优 ...
- VC++ 监控指定目录改变
转载:http://www.cnblogs.com/doublesnke/archive/2011/08/16/2141374.html VC++实施文件监控:实例和详解 相关帮助: http://h ...
- Django——model字段类型 2
Django 通过models实现数据库的创建.修改.删除等操作,Django中model作为数据资源指定了字段以及一些相应的功能,通常每个model对应数据库中的一张表,(每个model都是从dja ...