ORACLE subtype 子类型

定义子类型

我们可以在任何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 ;

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ZengMuAnSha/archive/2010/03/30/5431728.aspx

时间: 2024-11-05 14:46:35

ORACLE subtype 子类型的相关文章

Oracle中Long类型的使用与不可使用

ORA-01754 表只能包含一个LONG类型的列alter table 表名 add 字段名 long raw错误原因:数据表中同时建立了LONG RAW类型和LONG类型.--------------------------------------------------------------------------------------------------一.可以在以下情况使用long字段:1. select的list列表.SQL> insert into test_long va

java泛型 generics --- 第三部分 泛型、继承、和子类型

Generics, Inheritance, and Subtypes 正如你所知,可以把一种对象类型赋值给另一种类型,只要他们是兼容的.例如,你可以把Integer对象赋值给Object. Object someObject = new Object(); Integer someInteger = new Integer(10); someObject = someInteger; // OK 在面向对象技术中,这被称作"is a"关系.即一个Integer是一中Object,该赋

NX二次开发-UFUN查询对象的类型和子类型UF_OBJ_ask_type_and_subtype

1 NX9+VS2012 2 3 #include <uf.h> 4 #include <uf_obj.h> 5 #include <uf_modl.h> 6 #include <uf_part.h> 7 8 UF_initialize(); 9 10 //遍历当前显示部件 11 std::vector<tag_t> SolidVector; 12 tag_t ObjectTag = NULL_TAG; 13 int Type, SubType,

Oracle关于date类型数据的总结

往Oracle数据库中插入日期型数据(to_date的用法) INSERT  INTO  FLOOR  VALUES  ( to_date ( '2007-12-20 18:31:34' , 'YYYY-MM-DD HH24:MI:SS' ) ) ; 查询显示:2007-12-20 18:31:34.0 ------------------- INSERT  INTO  FLOOR  VALUES  ( to_date ( '2007-12-14 14:10' , 'YYYY-MM-DD HH2

Oracle修改字段类型和长度

Oracle修改字段名 alter table 表名 rename column 旧字段名 to 新字段名 Oracle修改字段类型和长度 alter table 表名 modify 字段名 数据类型 如果是修改数据类型比如由varchar2修改为int且字段内有值,会报如下错误 解决方法参考:http://blog.csdn.net/itmyhome1990/article/details/8681206 转载请注明出处:http://blog.csdn.net/itmyhome1990/ar

ORACLE与.NET类型对应关系(转)

ORACLE与.NET类型对应关系 想来这个是最重要的事情了,因为多数情况下,我们使用dbhelper来调用数据库的时候,是因为如下三个地方导致错误: 1.错误的sql语句:末尾多了分号,少了部分关键字 2.sql中的参数与parameter[]不对应. 3.parasmeter[]中的数据类型转为Oracle的数据类型中出错. 通常情况下,我们大设置paramenter[]时,只会给出变量名和对应的值(多数是.NET中的变量)去让ODP自动执行数据类型转换,而ODP一般都可以正确的转换,但是,

编写高质量代码改善C#程序的157个建议——建议57:实现ISerializable的子类型应负责父类的序列化

建议57:实现ISerializable的子类型应负责父类的序列化 我们将要实现的继承自ISerializable的类型Employee有一个父类Person,假设Person没有实现序列化,而现在子类Employee却需要满足序列化的场景.不过序列化器并没有默认处理Person类型对象,这些事情只能由我们自己做. 以下是一个不妥的实现,序列化器只发现和处理了Employee中Salary字段: class Program { static void Main() { Employee limi

ORACLE 中NUMBER 类型 低精度转换成高精度

例如: 表User中有一个字段 salary  Number(10,3), 如果想把字段salary的类型提高精度到salary  Number(10,6),保留六位小数, 解决办法:1,ALTER TABEL USER MODIFY SALARY NUMBER(13,6); 解释:number类型刚开始是,长度10位,3位小数,如果想增加3位小数,对应的长度也必须增加,否则无法修改.所以NUMBER(13,6);这样就可以提高精度了, ORACLE 中NUMBER 类型 低精度转换成高精度

oracle里long类型的总结

转自原文oracle中long类型为什么不推荐使用 不是不推荐使用的,是一般用不到,而有些时候是会用到的,所以不能一概而论.1.LONG 数据类型中存储的是可变长字符串,最大长度限制是2GB.2.对于超出一定长度的文本,基本只能用LONG类型来存储,数据字典中很多对象的定义就是用LONG来存储的.3.LONG类型主要用于不需要作字符串搜索的长串数据,如果要进行字符搜索就要用varchar2类型.4.很多工具,包括SQL*Plus,处理LONG 数据类型都是很困难的.5.LONG 数据类型的使用中