分类: Oracle
2009-09-08 01:25:07
2.1.5 使用Anchored 数据类型
给变量设定的数据类型可以基于某种数据库对象。这称作anchored 声明,因为变量的数据类型依赖于底层对象的数据类型。应该尽可能使用anchored 数据类型,以便于当基础对象的数据类型发生变化时,无需更改自己的PL/SQL 代码。语法如下所示:
如果自己是程序员,知道编程语言有哪些可以使用的主要数据类型是非常重要的。当解决某些编程问题时,这些数据类型能够提供很多解决方案。同样要注意,有些函数只适用于某些特殊的数据类型。如下是PL/SQL 中可以使用的主要Oracle 数据类型:
VARCHAR2(maximum_length)
存储变长的字符数据。
参数是必需的,指定字符数据的最大长度,最大为32 767 字节。
不使用常量或者变量来指定最大长度;必须使用整数型的字面值。
VARCHAR2 数据库列的最大宽度是4 000 字节。CHAR[(maximum_length)]
存储定长的字符数据(不足时使用空格填充)。
参数是可选的,指定字符数据的最大长度,最大为32 767 字节。
不使用常量或者变量来指定最大长度;必须使用整数型的字面值。如果没有指定最大长度,则默认为1。
CHAR 数据库列的最大宽度是2 000 字节,则默认值是1 字节。NUMBER[(precision,scale)]
存储任何大小的定点或者浮点数。
precision 是数字的位数。
scale 决定是否进行四舍五入。
可以指定精度和省略位,这时候scale 是0,并且只允许使用整数。
常量或者变量不能被用于指定精度和数值范围;必须使用整数类型的字面值。
NUMBER 值的最大精度是38 个十进制位。
数值范围为0 到127 。例如,数值2 会在最近的百分位进行四舍五入(3.456 变成3.46)。
数值范围可以是负数,会导致四舍五入到小数点的左边。例如,scale 为-3 时,会在千分位进行四舍五入(3 456 变成3 000)。Scale 为0 时,则在整数位进行四舍五入。如果不指定scale,其默认值是0。
BINARY_INTEGER
存储有正负之分的整数变量。
与NUMBER 数据类型相比较。BINARY_INTEGER 变量被存储为二进制格式,这样会占用更少空间。
计算速度更快。
可以存储-2 147 483 747 到2 147 483 747 之间的任何整数值。
这个数据类型主要用于索引PL/SQL 表。本书第15 章会更加深入讨论。不能在常规表中,创建类型为binary_integer 的列。
DATE
存储定长的日期值。
DATE 变量的有效日期在January 1 4712 BC 和December 31 9999 AD 的范围内。
当在数据库列中存储时,日期值包含从零时以来,以秒为单位的时间信息。
日期部分的默认值是当月的第1 天;时间部分的默认值是零时。
日期实际上存储为二进制格式,并按照默认格式进行显示。
TIMESTAMP
这个数据类型是DATE 数据类型的扩展。存储定长的日期值,精度到秒的小数位,最高为十进制小数位的第9 位(默认是6)。例如,12-JAN-2008 09.51.44.000000 PM 就是这种数据类型的默认值。
借助于WITH TIME ZONE 或者WITH LOCAL TIME ZONE 选项,能够把TIMESTAMP 绑定到特定时区。接着,这些设置会被调整到数据库的时区。比如,允许全球数据库中London 和New York 的记录使用相同的时间,即使New York 为中午,London 为下午5 点。
BOOLEAN
存储TRUE 、FALSE 或者空值NULL 。要记住,NULL 表示丢失的,未知的或者不使用的值。
只能把TRUE 、FALSE 或者空值NULL 赋予BOOLEAN 变量。
值TRUE 和FALSE 不能被插入到数据库列。
LONG
存储变长的字符串。
LONG 数据类型类似于VARCHAR2 数据类型,唯一区别是LONG 值的最大长度是2GB 。
不能从LONG 列选择大于4 000 字节的值填充到一个LONG 变量。
LONG 列可以存储文本、字符数组,甚至短小的文档。可以在UPDATE 、INSERT 和SELECT 语句中引用LONG 列,但是不能在表达式、SQL 函数调用或者特定SQL 子句(例如WHERE 、GROUP BY 和CONNECT BY 等)中引用。
LONG RAW
存储原始的二进制变量数据,最大不能超过2GB 。LOB(大型对象)
LOB 的4 种类型是BLOB 、CLOB 、NLOB 和BFILE 。可以存储二进制对象,例如图像或者视频文件,最大为4GB 。
BFILE 是存储在数据库之外的大型二进制文件。最大尺寸为4GB 。
ROWID
从根本上讲,每个Oracle 数据库都有一个ROWID 伪列,存储名为rowid 的二进制值。
Rowid 唯一地标识每行数据,并提供访问特定数据行的最快捷方式。
使用ROWID 数据类型,可以以易读的格式存储rowid 。
当选择或者检索rowid,并存入ROWID 变量时,可以使用函数ROWIDTOCHAR,把二进制值转换为18 字节的字符型字符串,并返回这个格式的数据。
扩展的rowid 使用每个数据行的物理地址的基础64 编码。编码字符为A ~Z,a ~z,0 ~9 以及+ 和/。ROWID 的格式为:OOOOOOFFFBBBBBBRRR 。每个组件都有自己特殊的含义。第1 部分OOOOOO 表示数据库段。接下来一部分FFF 表示表空间——包含该行数据的数据文件的数据文件编号。BBBBBB 部分是包含该行数据的数据块。最后一部分RRR 表示数据库中该行数据(要注意,Oracle 的未来版本可能对此的定义不同)。