Oracle 用户自定义数据类型
用户自定义数据类型(User-defined Data Type)
oracle支持对象类型(Object Type)、嵌套类型(Nested Table Type)和可变数组类型(Varray Data Type)三种用户自定义数据类型。
对象类型 用于描述客观世界中存在的事物,eg 客户、订单。对象类型是在其他内置数据类型基础上建立的,可以包括多个元素(属性),这些属性共同构成了结构化的数据单元,对象类型中还可以包含多种操作,称为(方法),用户可以对一个数据单元执行某种方法。这里的“方法”其实就是一些存储过程、函数。
create or replace type schoolType as OBJECT
(
name varchar2(30),
City varchar2(30),
Street varchar2(30)
);
对象有两种存储形式:
1,对象单独存储在关系表中,也就是整个表只存储对象,(对象表)。在这样的表中,每行表示一个对象,存储于对象表中的对象被称为行对象(Row Object).
2, 与表中其他数据一起存储,即对象只占表中的一列,这样的对象称为列对象(Column Object)
--创建对象表:
create table school_infor of schoolType;
--创建含有对象的关系表:
create table student_info
(name varchar2(10),
id number,
school schoolType);
SQL> desc student_info
名称 是否为空? 类型
----------------------------------------- -------- ----------------------
NAME VARCHAR2(10)
ID NUMBER
SCHOOL SCHOOLTYPE
insert into school_infor values(
schoolType ('北大','北京','中关村'));
SQL>select * from school_infor;
NAME CITY STREET
------------------------------ ------------------------
北大 北京 中关村
SQL> select stu.name || stu.id||stu.school.name||stu.school.city||stu.school.street
2 from student_info stu;
STU.NAME||STU.ID||STU.SCHOOL.NAME||STU.SCHOOL.CITY||STU.SCHOOL.STREET
---------------------------------------------------------------------------------------------
小花儿112北大北京中关村
drop TYPE schoolType;
可变数组类型(variable-size arrays Type)是一个有序的相同数据类型元素的集合。一个数组内所有数据元素的数据类型均相同,每一个元素均有一个索引编号(下标),代表元素在数组中的位置,通过下标访问数组元素。
可变数组数据通常采用内联存储(stored In Line),即与其在同一表中的其他数据存储在同一表空间内。但如果数据很大,也可以存储在BLOB中。
create Type address_list as VARRAY(10) of varchar2(80);--创建一种新的数据类型address_list
create TYPE phone_typ as OBJECT (
country_code varchar2(2),--国家代码
area_code varchar2(3),--区号
phone_number varchar2(7));--电话号码
create TYPE varray_phone as VARRAY(10) of phone_typ;
create table instructor (
name varchar2(10),
phone_list varray_phone);
insert into instructor values (
'张教授',
varray_phone(
phone_typ('86','010','6823323'),
phone_typ('86','020','2343130'),
phone_typ('86','029','2324575'))
);
SQL> select * from instructor;
NAME
----------
PHONE_LIST(COUNTRY_CODE, AREA_CODE, PHONE_NUMBER)
--------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
王教授
VARRAY_PHONE(PHONE_TYP('86', '010', '6623323'), PHONE_TYP('86', '020', '2323130'), PHONE_TYP('86', '029', '2353575'))
张教授
VARRAY_PHONE(PHONE_TYP('86', '010', '6823323'), PHONE_TYP('86', '020', '2343130'), PHONE_TYP('86', '029', '2324575'))
SQL> select country_code,area_code,phone_number
2 from table (select phone_list from instructor
3 where name = '王教授')
4 where area_code='029';
CO ARE PHONE_N
-- --- -------
86 029 2353575
嵌套表类型(nested Table Type)是一个无序的相同类型数据元素的集合,所有的元素具有相同的数据类型,定义嵌套表时无须指定元素的最大数量,元素的数据类型可以是标准的oracle数据类型,也可以是用户自定义的数据类型,使用create type ... as table of 定义嵌套表,注意:只是定义了一种新的数据类型,并未涉及任何空间的分配。
create or replace TYPE bookOBJType as OBJECT
(
bookid varchar2(10),
bookname varchar2(18),
describe varchar2(10))
not final;
create or replace type bookNESTType as TABLE OF bookOBJType;
create table studentbook
(
student_name varchar2(9) NOT NULL Primary Key,
home_address varchar2(9),
booklist bookNESTType
)
TABLESPACE USERDB
Nested Table booklist store as booklist_table (TABLESPACE USERS);
insert into studentbook values
(
'李晓晓',
'天津',
bookNESTType
(
bookOBJType ('113','《中国历史》','历史类'),
bookOBJType('114','《火星文》','科普类')
)
);
SQL> select * from studentbook;
STUDENT_N HOME_ADDR
--------- ---------
BOOKLIST(BOOKID, BOOKNAME, DESCRIBE)
---------------------------------------------------------------------------------------------------------
----------------------------------------------------------
王晓晓 上海
BOOKNESTTYPE(BOOKOBJTYPE('111', '《中国通史》', '历史类'), BOOKOBJTYPE('112', '《火星》', '科普类'))
李晓晓 天津
BOOKNESTTYPE(BOOKOBJTYPE('113', '《中国历史》', '历史类'), BOOKOBJTYPE('114', '《火星文》', '科普类'))
update table (select t.booklist from studentbook t where t.student_name ='王晓晓') tt
set tt.bookname ='《世界历史》'
where tt.bookname ='《中国通史》';
commit;
SQL> select * from studentbook;
STUDENT_N HOME_ADDR
--------- ---------
BOOKLIST(BOOKID, BOOKNAME, DESCRIBE)
--------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
王晓晓 上海
BOOKNESTTYPE(BOOKOBJTYPE('111', '《世界历史》', '历史类'), BOOKOBJTYPE('112', '《火星》', '科普类'))
李晓晓 天津
BOOKNESTTYPE(BOOKOBJTYPE('113', '《中国历史》', '历史类'), BOOKOBJTYPE('114', '《火星文》', '科普类'))
Oracle 用户自定义数据类型的更多相关文章
- Oracle自定义数据类型 1
原文 oracle 自定义类型 type / create type 一 Oracle中的类型 类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nva ...
- ORACLE抽象数据类型
ORACLE抽象数据类型 *抽象数据类型*/1,抽象数据类型 概念包含一个或多个子类型的数据类型不局限于ORACLE的标准数据类型可以用于其他数据类型中 2,创建抽象数据类型 的语法(必须用NOT F ...
- ORACLE基本数据类型总结
ORACLE基本数据类型(亦叫内置数据类型 built-in datatypes)可以按类型分为:字符串类型.数字类型.日期类型.LOB类型.LONG RAW& RAW类型.ROWID &am ...
- Oracle自定义数据类型 2 (调用对象方法)
调用对象方法 调用对象方法基于类型创建表后,就可以在查询中调用对象方法 A. 创建基于对象的表语法: create table <表名> of <对象类型>意义 ...
- SQL Server用户自定义数据类型
用户自定义数据类型:基于系统数据类型,由数据库管理员生成.利用系统存储过程定义用户自定义数据类型` Sp_addtype [@typename=] 新数据类型名, [@phystype=] 系统数据类 ...
- ORACLE的数据类型的长度合集
-- ORACLE的数据类型常用的数据库字段类型如下:字段类型 中文说明 限制条件 其它说明CHAR 固定长度字符串 最大长度2000 bytesVARCHAR2 可变长度的字符串 最大长度4000 ...
- Oracle 基本操作--数据类型、修改和删除表、增删改查和复制表
一.Oracle基础数据类型:数据类型: 创建数据表时,设计数据表的结构问题,也就是设计及确定数据表中各个列的数据类型,是数值.字符.日期还是图像等其他类型. 因为只有设计好数据表结构,系统才会在磁盘 ...
- oracle中数据类型number(m,n)
oracle中数据类型number(m,n)中m表示的是所有有效数字的位数,n表示的是小数位的位数.m的范围是1-38,即最大38位. 1> .NUMBER类型细讲:Oracle numbe ...
- 【Oracle】Oracle基本数据类型总结
ORACLE基本数据类型(亦叫内置数据类型 built-in datatypes)可以按类型分为:字符串类型.数字类型.日期类型.LOB类型.LONG RAW& RAW类型.ROWID &am ...
随机推荐
- 【Java】 List和Array转换
List转Array toArray 首先展示初学者容易犯的错误示例 List<String> strList = new ArrayList<>(); strList.add ...
- 微信小程序小窗无效
这里算是踩过一个坑吧 1.自己的调试版本库是否在这个版本或者以上 2.编辑器是不能看到小窗效果的,只能在真机运行 3.播放的内容是否有效,是否能播放 4.跳转页面时内容是否处于播放状态 5.当前页面是 ...
- dotNET开发之MVC中Controller返回值类型ActionResult方法总结
1.返回ViewResult视图结果,将视图呈现给网页 2. 返回PartialViewResult部分视图结果,主要用于返回部分视图内容 3. 返回ContentResult用户定义的内容类型 4. ...
- mui中openWindow方法的通用封装
因为做项目跳转新页面和传参的场景太多了,而且有的页面需要的跳转动画也不一样,每次都写一大堆openWindow方法的配置项太麻烦,因此自己简单封装了一个小函数,用来方便webview页面的跳转和传参. ...
- Modelsim仿真新手入门最详细教程
2021年11月15日 00 安装包/版本 我是提前在网上下好的(但这一点也给我的实验造成了"麻烦"),用的是Modelsim SE-64 2020.4版本的,学校实验室的似乎不同 ...
- Windows漏洞:MS08-067远程代码执行漏洞复现及深度防御
摘要:详细讲解MS08-067远程代码执行漏洞(CVE-2008-4250)及防御过程 本文分享自华为云社区<Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御>,作者 ...
- 菜鸡的Java笔记 第二十八 - java 包的定义
包的主要作用以及定义 包的导入操作 系统常见的开发包 jar 程序命令 包的定义 在任何的操作系统之中都有一个统一的共识:同一个目录下不能够存在有相同的文 ...
- [loj3277]星座3
如果不合法,利用贪心发现当且仅当某两个星星所构成的矩形中没有白点 反过来,考虑留下若干个星星,那么即要求留下的星星两两之间满足:$\max_{x_{1}\le i\le x_{2}}a_{i}\ge ...
- opencv 视频处理相关
包含视频格式知识(编解码和封装格式):如何获取视频信息及视频编解码格式:opencv读取及保存视频,及opencv fourcc编码格式 一.基础知识 视频的编解码格式和封装格式 参考如山似水 视频编 ...
- 🏆【Alibaba中间件技术系列】「RocketMQ技术专题」让我们一起探索一下DefaultMQPushConsumer的实现原理及源码分析
RocketMQ的前提回顾 RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆 ...