一、子类型

这种类型最简单,类似类型的一个别名,主要是为了对常用的一些类型简单化,它基于原始的某个类型。如:

有些应用会经常用到一些货币类型: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 自定义类型相关推荐

  1. oracle自定义的记录类型,oracle 自定义类型 type / create type

    一:Oracle中的类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nvarchar2. 2.数值类型.如:int.number(p,s).integ ...

  2. oracle date 转换 timestamp,Oracle timestamp类型转换成date类型

    今天需要根据时间判断,统一修改某一个字段的数据.然后打开数据库发现,时间类型为timestamp类型.如下: 然后呢,这对我不是喝口水就可以解决的问题吗? 解决方案如下:我需要改这张表某个字段的内容, ...

  3. oracle vm concat指定分隔符,重写Oracle的wm_concat函数,自定义分隔符、排序

    oracle中,wm_concat函数是一个聚合函数,和mysql中的group_concat函数类似,不过group_concat函数比较强大,可以定义分隔符和排序,当然所谓强大是相对的,这里假使我 ...

  4. Oracle 11g Release 1 (11.1) Oracle 本文索引的四种类型

    http://docs.oracle.com/cd/B28359_01/text.111/b28303/ind.htm#g1020588 本文内容 对于 Oracle 文本,你可以使用 CREATE ...

  5. oracle中怎么自定义函数,Oracle自定义函数

    用户自定义函数是存储在数据库中的代码块,可以把值返回到调用程序.函数的参数有3种类型: (1)in参数类型:表示输入给函数的参数,该参数只能用于传值,不能被赋值. (2)out参数类型:表示参数在函数 ...

  6. oracle权限分几种类型,Oracle权限和数据类型

    oracle创建用户: CREATE USER 用户名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK] [注]LOCK|UNLOCK创建用户时是否锁定,默认为锁定状态.锁 ...

  7. vba 定义类_VBA|自定义类型、枚举类型和类模块及其使用

    VBA中,自定义类型相当于C语言中的结构体,枚举类型也与C语言中的枚举类型相似.自定义类型和枚举类型放到模块的子过程的前面即可. VBA中, 类模块相当于C语言中的类,类模板要单独放到类模块中(自定义 ...

  8. oracle 函数参数类型,ORACLE 11g中的表值函数? (参数化视图)

    搜索热词 过去我已经看过关于这个问题的讨论,比如 here.但是我想知道如果某个地方沿线,或许10g或11g(我们正在使用11g),ORACLE已经对"参数化视图"提供了更好的支持 ...

  9. oracle record 类型,Oracle记录类型(record)和%rowtype

    Oracle中的记录类型(record)和使用%rowtype定义的数据类型都是一种单行多列的数据结构,可以理解为一个具有多个属性的对象.其中属性名即为列名. 记录类型(record) 记录类型是一种 ...

最新文章

  1. vue 数据绑定实现的核心 Object.defineProperty()
  2. SQL语句删除重复记录
  3. 数字中国建设再提速,智慧金融发展如何跑出“加速度”?
  4. 自建邮件服务器更给力?
  5. java的两种方式_java 两种方式的区别?
  6. Android.mk宏定义demo【转】
  7. For in + 定时器
  8. 排序系列02--选择排序
  9. 华为交换机重制_华为交换机重置命令
  10. webstorm更换主题后快捷键失效
  11. 报表系统软件有哪些_报表系统软件功能
  12. 应用密码学:单表代替密码简单介绍
  13. 华为设备静态路由配置命令
  14. python清空文本框内容_js清空文本框
  15. shopex手机版之触屏版,html5版,ShopEx手机触屏版V3.0重磅发布!优化用户界面,增强用户体验...
  16. Java内存模型(JMM)
  17. 2017.9.21 HTML学习总结---多媒体播放系统设计
  18. Java工程师未来的三大就业方向
  19. 担心PPT封面页不够出彩?这些例子建议收藏
  20. 亚马逊测评如何做?亚马逊测评的获得方法?

热门文章

  1. php任务分配思路_PHP执行定时任务的几种方法思路
  2. StringBuffer和StringBuild
  3. html加载状态,js等待页面加载完成
  4. linux脚本监控某一进程,linux监控某个进程的运行shell脚本
  5. java手机象棋软件下载,Java手机网络版象棋游戏附源码JAVA游戏源码下载
  6. java有没有number数据类型_Java基本数据类型之Number
  7. python实现进程通信_python进程间的通讯实现
  8. artifacts屏蔽java文件输出_Java 是什么?
  9. java技术文章在哪里看呢_谈论Java技术似乎无处不在,但究竟是什么呢?文章末尾有福利...
  10. 单片机c语言 oxfe,AVR单片机入门及C语言高效设计实践(五)