1.NUMBER
NUMBER类型既可以表示整数,也可以表示浮点数,格式如下:
NUMBER [ (precision , scale) ]
精度:所允许数值的总长度,也就是数值中所有数字位的个数,最大值为38.
刻度:刻度用来确定小数位数,同时也确定在什么地方进行舍入。当刻度是正数时,刻度范围是小数点右边的数字位个数。
当刻度是负数时,刻度范围是小数点左边的数字位个数,从该位开始舍入。
如果不指定精度和刻度,则默认为最大精度,即38位。
DECLARE
num1 NUMBER:=3.1415926; --没有精度,默认为38位;结果:3.1415926
num2 number(3) :=3.1415926; --精度3,刻度0. 结果:3.142
-- num3 number(3) :=3141.5926; --错误,数字精度大于3。
num4 number(4,3) :=3.1415926; --刻度3,保留小数点后3位,舍入 。num4:=3.142
-- num5 number(4,3) :=3141.5926; --错误,数字精度大于3。
num6 number(8,3) :=31415.9267; --num6:=31415.927
num7 number(4,-3):=31415.9267; --刻度是-3,舍去小数点左边的前3位。num7:=31000
-- num8 number(4,-3):=12345678.901; --错误,数字精度大于4-(-3)。
num9 number(4,-3):=314.159267; --结果为0.因为刻度是3,舍去小数点左边3位。 num9:=0
-- num0 number(4,-1):=123456; --错误,数字精度大于4-(-1);
BEGIN
DBMS_OUTPUT.put_line('num1:=' || num1);
DBMS_OUTPUT.put_line('num2:=' || num2);
DBMS_OUTPUT.put_line('num4:=' || num4);
DBMS_OUTPUT.put_line('num6:=' || num6);
DBMS_OUTPUT.put_line('num7:=' || num7);
DBMS_OUTPUT.put_line('num9:=' || num9);
END;
2、LOB对象类型
LOB类型又称为大型对象类型,包含了BLOB,CLOB和NCLOB(内部存储)和BFILE(外部存储),它可以存储大的和没有结构的数据。例如文本、图像、视频和空间数据,大小能达到4GB。
LOB对象通过定位器来操作数据,因此在LOB类型中一般会包含一个定位器,定位器用于指向LOB数据。比如当使用查询语句选择一个BLOB类型的列时,将只有定位器被返回。
3、自定义子类型
自定义子类型,就是在标准类型的基础上进行进一步约束而创建的新类型。但实际上,子类型只是基类型的候选名称,不是一个新类型。
子类型的定义语法如下:
SUBTYPE subtype_name IS base_type[ (constraint) ] [ not null ]
【SUBTYPE】:用来指定当前声明一个子类型
【subtyep_name】:子类型名称
【IS】:指定子类型将要使用的基类型
【base_type】:指定子类型的基类,可以是任何标量类型或用户定义的类型。
【constraint】:约束知识用于限定基类型的精度和数值范围,或者最大长度。
【NOT NULL】:非空。
DECLARE
SUBTYPE empcounttype IS INTEGER; --定义子类型
empcount empcounttype; --声明子类型变量
--定义表类型
TYPE empnamelist IS TABLE OF VARCHAR2 (20);
SUBTYPE namelist IS empnamelist; --定义表类型的子类型。
--定义数组类型
TYPE T_arr IS VARRAY(20) OF VARCHAR2(20);
SUBTYPE arr IS T_arr; --定义数组子类型
lsit arr;
--定义记录类型
TYPE empinfo IS RECORD(
empid number(4),
empname varchar(20)
);
SUBTYPE emprecord IS empinfo; --定义记录类型的子类型
T_emp emprecord;
SUBTYPE empno IS emp.empid%TYPE; --定义%TYPE 子类型
SUBTYPE emprow IS emp%ROWTYPE; --定义%ROWTYPE 子类型
BEGIN
NULL;
END;