oracle如何自定义类型,Oracle 自定义类型
一、子类型
这种类型最简单,类似类型的一个别名,主要是为了对常用的一些类型简单化,它基于原始的某个类型。如:
有些应用会经常用到一些货币类型:number(16,2)。如果在全局范围各自定义这种类型,一旦需要修改该类型的精度,则需要一个个地修改。
那如何实现定义的全局化呢?于是就引出了子类型:
subtype cc_num is number(16,2);
这样就很方便地解决了上述的麻烦。
我们可以在任何PL/SQL块、子程序或包中定义自己的子类型
SUBTYPE subtype_name IS base_type[(constraint)] [NOT NULL ];
subtype_name就是声明的子类型的名称,base_type可以是任何标量类型或用户定义类型,约束只是用于限定基类型的精度和数值范围,或是最大长度。下面举几个例子:
DECLARE
SUBTYPE birthdate IS DATE NOT NULL ; -- based on DATE type
SUBTYPE counter IS NATURAL ; -- based on NATURAL subtype
TYPE namelist IS TABLE OF VARCHAR2 (10);
SUBTYPE dutyroster IS namelist; -- based on TABLE type
TYPE timerec IS RECORD (
minutes INTEGER ,
hours INTEGER
);
SUBTYPE finishtime IS timerec; -- based on RECORD type
SUBTYPE id_num IS emp.empno%TYPE ; -- based on column type
我们可以使用%TYPE或%ROWTYPE来指定基类型。当%TYPE提供数据库字段中的数据类型时,子类型继承字段的大小约束(如果有的话)。但是,子类型并不能继承其他约束,如NOT NULL。
2、使用子类型
一旦我们定义了子类型,我们就可以声明该类型的变量、常量等。下例中,我们声明了Counter类型变量,子类型的名称代表了变量的使用目的:
DECLARE
SUBTYPE counter IS NATURAL ;
ROWS counter;
下面的例子演示了如何约束用户自定义子类型:
DECLARE
SUBTYPE accumulator IS NUMBER ;
total accumulator(7, 2);
子类型还可以检查数值是否越界来提高可靠性。下例中我们把子类型Numeral的范围限制在-9到9之间。如果程序把这个范围之外的数值赋给Numeral类型变量,那么PL/SQL就会抛出一个异常。
DECLARE
SUBTYPE numeral IS NUMBER (1, 0);
x_axis numeral; -- magnitude range is -9 .. 9
y_axis numeral;
BEGIN
x_axis := 10; -- raises VALUE_ERROR
...
END ;
二、普通类型
create or replace type SH_type1 as object (
col1 number,
col2 varchar2(50),
col3 date,
);
create or replace type SH_TABLE_TYPE1 IS TABLE OF SH_type1;
create table t1_type of SH_type1;
insert into t1_type(COL1,COL2,COL3) values(SH_sqe_ASC.NEXTVAL,‘hello‘,sysdate-10);
SELECT * FROM T1_TYPE;
三、带成员函数的类型体
这种类型包含了对类型中数据的内部处理,调用该类型时,可将处理后的数据返回给调用方。
对上面的例子进行扩展。要求给当天加上特殊标识(【】)来突出显示。
首先,在typ_calendar中增加一个成员函数声明:
create or replace type typ_calendar as object(
年 varchar2(8),
月 varchar2(8),
星期日 varchar2(8),
星期一 varchar2(8),
星期二 varchar2(8),
星期三 varchar2(8),
星期四 varchar2(8),
星期五 varchar2(8),
星期六 varchar2(8),
本月最后一日 varchar2(2),
member function format(
curday date := sysdate,
fmtlen pls_integer := 8
)return typ_calendar
)
然后,创建一个type body,在type body中实现该成员函数:
create or replace type body typ_calendar as
member function format(
curday date := sysdate,
fmtlen pls_integer := 8
) return typ_calendar as
v_return typ_calendar := typ_calendar(‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘);
v_dd varchar2(2) := to_char(curday, ‘dd‘);
function fmt(
fmtstr varchar2
)return varchar2 as
begin
return lpad(fmtstr, fmtlen, ‘ ‘);
end fmt;
begin
v_return.年 := 年;
v_return.月 := 月;
v_return.星期日 := fmt(星期日);
v_return.星期一 := fmt(星期一);
v_return.星期二 := fmt(星期二);
v_return.星期三 := fmt(星期三);
v_return.星期四 := fmt(星期四);
v_return.星期五 := fmt(星期五);
v_return.星期六 := fmt(星期六);
v_return.本月最后一日 := 本月最后一日;
if (年 || lpad(月, 2, ‘0‘) = to_char(curday, ‘yyyymm‘)) then
case v_dd
when 星期日 then
v_return.星期日 := fmt(‘【‘ || 星期日 || ‘】‘);
when 星期一 then
v_return.星期一 := fmt(‘【‘ || 星期一 || ‘】‘);
when 星期二 then
v_return.星期二 := fmt(‘【‘ || 星期二 || ‘】‘);
when 星期三 then
v_return.星期三 := fmt(‘【‘ || 星期三 || ‘】‘);
when 星期四 then
v_return.星期四 := fmt(‘【‘ || 星期四 || ‘】‘);
when 星期五 then
v_return.星期五 := fmt(‘【‘ || 星期五 || ‘】‘);
when 星期六 then
v_return.星期六 := fmt(‘【‘ || 星期六 || ‘】‘);
else null;
end case;
end if;
return v_return;
end format;
end;
插入测试数据:
SQL> insert into tcalendar
2 select typ_calendar(‘2010‘,‘05‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘31‘) from dual
3 /
1 row inserted
SQL> insert into tcalendar
2 select typ_calendar(‘2010‘,‘05‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘31‘).format() from dual
3 /
1 row inserted
SQL> insert into tcalendar
2 select typ_calendar(‘2010‘,‘05‘,‘11‘,‘12‘,‘13‘,‘14‘,‘15‘,‘16‘,‘17‘,‘31‘).format() from dual
3 /
1 row inserted
SQL> select * from tcalendar;
可以看到数据已经居中处理了,并且到了第三条已经可以突出显示当前日期了。
在这里type 中的成员函数(member function)和静态函数(static function)的区别有必要说明一下:
成员函数有隐含参数self,即自身类型,可以在执行的时候引用当前的数据并对数据进行操作。它的调用可以如下:object_expression.method()
静态函数没有该隐含参数。它的调用如下:type_name.method();
举个例子:
首先,创建一个带静态函数声明的类型头:
原文:http://www.cnblogs.com/shcqupc/p/5099035.html
oracle如何自定义类型,Oracle 自定义类型相关推荐
- oracle自定义的记录类型,oracle 自定义类型 type / create type
一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integ ...
- oracle date 转换 timestamp,Oracle timestamp类型转换成date类型
今天需要根据时间判断,统一修改某一个字段的数据.然后打开数据库发现,时间类型为timestamp类型.如下: 然后呢,这对我不是喝口水就可以解决的问题吗? 解决方案如下:我需要改这张表某个字段的内容, ...
- oracle vm concat指定分隔符,重写Oracle的wm_concat函数,自定义分隔符、排序
oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...
- Oracle 11g Release 1 (11.1) Oracle 本文索引的四种类型
http://docs.oracle.com/cd/B28359_01/text.111/b28303/ind.htm#g1020588 本文内容 对于 Oracle 文本,你可以使用 CREATE ...
- oracle中怎么自定义函数,Oracle自定义函数
用户自定义函数是存储在数据库中的代码块,可以把值返回到调用程序.函数的参数有3种类型: (1)in参数类型:表示输入给函数的参数,该参数只能用于传值,不能被赋值. (2)out参数类型:表示参数在函数 ...
- oracle权限分几种类型,Oracle权限和数据类型
oracle创建用户: CREATE USER 用户名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK] [注]LOCK|UNLOCK创建用户时是否锁定,默认为锁定状态.锁 ...
- vba 定义类_VBA|自定义类型、枚举类型和类模块及其使用
VBA中,自定义类型相当于C语言中的结构体,枚举类型也与C语言中的枚举类型相似.自定义类型和枚举类型放到模块的子过程的前面即可. VBA中, 类模块相当于C语言中的类,类模板要单独放到类模块中(自定义 ...
- oracle 函数参数类型,ORACLE 11g中的表值函数? (参数化视图)
搜索热词 过去我已经看过关于这个问题的讨论,比如 here.但是我想知道如果某个地方沿线,或许10g或11g(我们正在使用11g),ORACLE已经对"参数化视图"提供了更好的支持 ...
- oracle record 类型,Oracle记录类型(record)和%rowtype
Oracle中的记录类型(record)和使用%rowtype定义的数据类型都是一种单行多列的数据结构,可以理解为一个具有多个属性的对象.其中属性名即为列名. 记录类型(record) 记录类型是一种 ...
最新文章
- vue 数据绑定实现的核心 Object.defineProperty()
- SQL语句删除重复记录
- 数字中国建设再提速,智慧金融发展如何跑出“加速度”?
- 自建邮件服务器更给力?
- java的两种方式_java 两种方式的区别?
- Android.mk宏定义demo【转】
- For in + 定时器
- 排序系列02--选择排序
- 华为交换机重制_华为交换机重置命令
- webstorm更换主题后快捷键失效
- 报表系统软件有哪些_报表系统软件功能
- 应用密码学:单表代替密码简单介绍
- 华为设备静态路由配置命令
- python清空文本框内容_js清空文本框
- shopex手机版之触屏版,html5版,ShopEx手机触屏版V3.0重磅发布!优化用户界面,增强用户体验...
- Java内存模型(JMM)
- 2017.9.21 HTML学习总结---多媒体播放系统设计
- Java工程师未来的三大就业方向
- 担心PPT封面页不够出彩?这些例子建议收藏
- 亚马逊测评如何做?亚马逊测评的获得方法?
热门文章
- php任务分配思路_PHP执行定时任务的几种方法思路
- StringBuffer和StringBuild
- html加载状态,js等待页面加载完成
- linux脚本监控某一进程,linux监控某个进程的运行shell脚本
- java手机象棋软件下载,Java手机网络版象棋游戏附源码JAVA游戏源码下载
- java有没有number数据类型_Java基本数据类型之Number
- python实现进程通信_python进程间的通讯实现
- artifacts屏蔽java文件输出_Java 是什么?
- java技术文章在哪里看呢_谈论Java技术似乎无处不在,但究竟是什么呢?文章末尾有福利...
- 单片机c语言 oxfe,AVR单片机入门及C语言高效设计实践(五)