PL/SQL数据类型

  在定义变量或常量时,必须要指定一个数据类型,PL/SQL是一种静态类型化的程序设计语言,静态类型化又称为强类型化,也就是说类型会在编译时而不是在运行时被检查,这样在编译时便能发现类型错误,以便增强程序的稳定性。

  PL/SQL提供多种数据类型,这些类型可以分为如下4大类:

  标量类型:用来保存单个值的数据类型,包含字符型、数字型、布尔型和日期型。

  复合类型:复合类型是具有内部子组件的类型,可以包含多个标量类型作为其属性。复合类型包含记录、嵌套表、索引表和变长数组。

  引用类型:引用类型是一个指向不同存储位置的指针,引用类型包含REF CURSOR和REF这两种。

  LOP类型:LOP类型又称大对象类型,用来处理二进制和大于4GB的字符串。

  1.CHAR

  存储固定的字符数据,CHAR有一个可选的整型值参数用来指定字符的长度,最大32767个字节,CHAR的声明语法如下:

  CHAR[ (maximum_size  [CHAR | BYTE]  ) ]

  maximum_size用于指定字符的长度,其值不能是常量或变量,只能是1~32767之间的整型数字,该参数的默认值为1。

  注意:尽管在PL/SQL中可以向CHAR类型指定32767个长度的字符,但是在Oracle数据库中,CHAR类型字段的最大长度为2000个字节,所以不能往数据库插入超过2000个字节的字符。

  2.VARCHAR2

  VARCHAR2变量存储变长字符串,当定义一个变长字符串时,必须要指定字符串的最大长度,其值范围为1~32767个字节,在指定长度时也可以选择性地指定CHAR或BYTE参数,语法如下:

  VARCHAR2[ (maximum_size  [CHAR | BYTE]  ) ]

  maximum_size用于指定最大的长度,不能使用常量或变量来指定这个值,必须使用整型数值。与定长的CHAR类型的最大的不同在于实际的基于字节的长度依据实际赋给变量的具体长度而定,这依赖于数据库的字符集设置,例如Unicode UTF-8字符集使用3个字节表示一个字符。

  注意:尽管PL/SQL的VARCHAR2的最大长度为32767字节,但是在数据库中VARCHAR2数据类型最大为4000字节,因此在PL/SQL块中为数据库中的列赋值时要注意大小的限制。

  VARCHAR2有两个字类型:STRING    VARCHAR , 它们的功能与VARCHAR2完全相同,完全可以看作是VARCHAR2的一个别名。使用这些字类型来与ANSI/ISO和IBM类型兼容。

目前,VARCHAR和VARCHAR2有着相同的意义,但是在以后的PL/SQL版本中,为了符合SQL标准,VARCHAR有可能会作为一个单独的类型出现,所以最好使用VARCHAR2,而不是VARCHAR

  3.LONG 和LONG RAW

  LONG类型和VARCHAR2非常相似,但是LONG类型的最大长度是32760字节,比VARCHAR2少了7个字节。

  LONG RAW类型用来存储二进制数据和字节字符串,LONG RAW数据和LONG数据相似,最大字节也为32760.

  Oracle数据库同样提供了LONG和LONG RAW列类型,与PL/SQL不同的是,这两个类型的最大存储量是2GB,因此可以在PL/SQL中将任何值插入LONG或LONG RAW类型的数据库中。

注意:在SQL语句中,PL/SQL将LONG类型的值当作VARCHAR2进行处理,而不是LONG类型,如果长度超过VARCHAR2允许的最大长度即4000字节时,Oracle会自动转换成LONG类型。

  由于LONG和LONG RAW是Oracle为了向后兼容性的考虑,因此因该尽量避免在新的开发中使用这两个数据类型。

  4.ROWID和UROWID

  每个Oracle数据表都有一个名为ROWID的伪列,这个伪列用来存放每一行数据的存储地址的二进制值。

  每个ROWID值是由18个字符组合进行表示的,ROWID又有物理ROWID和逻辑ROWID之分。物理ROWID用来表示普通数据表中的一行信息,而逻辑ROWID能够标识索引组织表中的一行信息。ROWID只能存储物理内容,UROWID或称通用ROWID类型可以存储物理、逻辑或非Oracle的ROWID。物理的ROWID可以显著的加速数据检索的性能,因为只要行存在,物理ROWID值就不会改变。PL/SQL的ROWID可以借助于ROWIDTOCHAR函数或CHARTOROWID函数来获取或转换ROWID信息。

  5.NCHAR和NVARCHAR2

  这两个类型是CHAR和VARCHAR2的Unicode版本。

  6.NUMBER

  NUMBER类型及可以表示整数,亦可以表示浮点数。

  NUMBER[ (precision,scale) ]

  两个参数用于声明精度和刻度

  精度:所允许的值的总长度,也就是数值中所有数字位的个数,最大值为38.

  刻度:刻度范围是小数点右边的数字位的个数,可以是负数,表示由小数点开始向左进行计算数字的个数。

  精度和刻度范围是可选的,如果指定了刻度范围,那么也必须指定精度。

  如果不指定精度和刻度值,则使用最大的精度来声明NUMBER类型,即默认精度为38.刻度用来确定小数位数,同时确定在什么地方那个进行舍入,范围在 -84~127之间,如果被指派的值超过了指定的刻度范围,则存储值会按照刻度指定的位数进行四舍五入。

NUMBER类型具有几个字类型,用来与ANSI/ISO或IBM类型相兼容,字类型是可选的类型候选名,可以用来限制字类型变量的合法取值。NUMBER类型有好几种等价的字类型,可以看作是重命名的NUMBER数据类型:

  DEC

  DECIMAL 

  DOUBLE PRECISION

  FLOAT

  INTEGER

  INT

  NUMERIC

  REAL

  SMALLINT

  7.PLS_INTEGER和BINARY_INTEGER

  PLS_INTEGER和BINARY_INTEGER具有相同的取值范围,都是从-2147483647~+2147483647,PLS_INTEGER相对于NUMBER来说需要更少的内存空间来存储数据,而且在计算方面也远比NUMBER更有效率。

  NUMBER数据类型是以十进制格式进行存储的,为了进行算术运算,NUMBER必须要转换为二进制类型,因此效率相对来说会比较慢。BINARY_INTEGER以2的补码二进制形式进行存储,可以直接进行计算而无需转换,因此在PL/SQL块中而非数据库中的变量用于计算时,使用BINARY_INTEGER可以提供较好的性能。

  PLS_INTEGET与BINARY_INTEGER类似,也是使用2的补码格式进行计算,并且在数字一处时会产生异常。这两种数据类型的典型区别是:如果在为PLS_INTEGER类型的变量赋值一处时,会触发异常;而当为BINARY_INTEGER类型的变量赋的值溢出时,会将结果指派为NUMBER类型的拥有最大精度的类型,不会触发异常。

  8.日期和时间类型

  DATE

  DATE类型用来存储时间和日期信息,包含世纪、年、月、日、小时、分钟、秒,但是不包含秒的小数部分。DATE类型从世纪到秒每一部分是一个字节,即占用7个字节。可以使用TO_DATE和TO_CHAR这两个内置的函数在日期和字符串之间转换。

  DATE类型的有效日期范围是从公元前4712年1月1号到公元9999年12月31号,默认的日期格式是由Oracle的初始化参数NLS_DATA_FORMAT来设置的。

  可以直接对日期运算进行加减运算,这样返回的是两个日期之间相关的天数,PL/SQL会将进行运算的整数看作是天数。

  SELECT SYSDATE-5 FROM DUAL;

  这个查询将返回5天前的日期。

  TIMESTAMP

  与DATE不同的是TIMESTAMP它可以存储秒字段的小数部分。

  TIMESTAMP[(P)]

  P:是秒字段的小数部分的精度,默认为6.

  TIMESTAMP WITH TIME ZONE

  TIMESTAMP WITH LOCAL TIME ZONE

  INTERVAL

  9.布尔类型

  Oracle数据库并不包含布尔类型,多数情况下使用CHAR(1)来代替布尔值,PL/SQL为了结构化程序的需要包含了布尔值,不能往数据库中插入或者从数据库中检索出布尔类型的值。

  可以使用BOOLEAN类型来存储逻辑值True、False和NULL值,布尔值仅用在逻辑操作中,而不能用PL/SQL的布尔值与数据库交互。

注意:在而布尔值赋True或False时,不需要使用引号,使用引号会将触发异常。

  10.LOB对象类型

  LOB类型又称为大型对象类型,包含了BFILE、BLOB、CLOB和NCLOB等类型,LOB类型最大可存储4GB的非结构数据,其访问比对LONG和LONG RAW数据的访问更有效,它们允许高效地、随机地分段访问数据,而且限制要更少。LOB类型通常用来存储文本、图像、声音和视频等大型数据。

  LOB与LONG的区别:

  LOB类型可以作为对象类型的属性,但LONG类型不可。

  LOB类型最大值是4GB,而LONG只有2GB。

  LOB支持随机访问数据,当LONG只支持顺序访问。

  LOB对象通过定位器来操作数据,因此在LOB类型中一般会包含一个定位器,定位器用来指向LOB数据。比如当使用查询语句选择一个BLOB类型的列时,将只有定位器被返回。通过定位器来完成对大型数据对象的操作。

  

  LOB包含的几种数据类型及其含义如下所示:

  BFILE:BFILE用来在数据库外的操作系统文件中存储大型的二进制文件,在数据库中,每一个BFILE存储着一个文件定位器,用来指向服务器上的大型二进制文件。

  BLOB:BLOB类型用来在数据库内部大型的二进制对象,每一个BLOB变量存储一个定位器指向一个大型二进制对象,其大小不能超过4GB字节。BLOB可以参与整个事务处理,可以被复制和恢复。一般使用DBMS_LOB来提交和回滚事务。

  CLOB:用来在数据库中存储大型的字符型数据,其大小也不可超过4GB。

  NCLOB:用来在数据库中存储大型的NCHAR类型数据,NCLOB可以支持特定长字符集和变长字符集,可以参与事务的处理,可以被恢复和复制。

注意:从Oracle 9i 开始,可以将CLOB转换成CHAR和VARCHAR2类型。可以将BLOB转换成RAW类型,可以使用DBMS_LOB包来读取和写入LOB数据。

原文地址:https://www.cnblogs.com/harriets-zhang/p/10784945.html