Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据
Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据
7.1 程序数据的命名
PL/SQL要求在给数据结构命名的时候应该遵守下面的规则
- 名字的长度最长可以30个字符
- 名字必须以字母开始。
- 在第一个字母之后,可以使用字符包括,字母,数字,$,#,_
- 所有的名字是不区分大小写的(除非名字被放在双引号里)。
- 这些命名规则也有一些例外。如果在声明时把名字放在双引号中,你实际上可以跳过了除了最30字符限制之外的所有规则。
7.2 PL/SQL数据类型概述
所有这些预先定义好的数据类型都是在PL/SQL的STANDARD包中定义的。
7.2.2 数字
Oracle数据库10g之前,NUMBER是唯一一个能够和数据库的数据类型直接对应的PL/SQL的数值型数据类型。
Oracle数据库10g引入了两种二进制浮点类型:BINARYFLOAT和BINARYDOUBLE。都可以同时在数据库和PL/SQL中使用。不同的是它们有二进制的精度,因此会有四舍五入。这两种类型支持NaN和正无穷和负无穷,只要底层平台允许,这些二进制类型的自述完全可以通过硬件完成,因此应用程序的性能也会得到极大的提升。
Oracle11g又增加了两种浮点数变体,SIMPLEFLOAT和SIMPLEDOUBLE,不过它们不允许NULL值,而且发生溢出时也不会抛出异常。
7.2.3 日期,时间戳和时间间隔
- 9i以前,只有DATA这一种数据类型,精确到秒。
- 9i之后,引入了两种新的数据类型,INTERVAL和TIMESTAMP。
7.2.4 布尔类型
取值范围:TRUE,FALSE和NULL
7.2.5 二进制数据类型
- BILE数据类型代表着保存在数据库之外的操作系统文件中的非结构化二进制数据。
- RAW像VARCHAR2字符类型一样,是一个变长的数据类型。只是Oracle工具在处理RAW数据时不会做字符集转换操作。
- LONG RAW最好移植到BLOB,因为LONG RAW列可以存2G数据,但PL/SQL只能处理前32760个字节。
7.2.6 ROWIDs
- ROWID代表了表中一行记录的唯一物理地址
- UROWID代表了一个索引组织表中一条记录的逻辑地址。
7.2.7 REF CURSORs
- 强REF CURSOR游标变量和一个特定的记录结构(使用%ROWTYPE)关联在一起。
- 弱REF CURSOR游标变量没有关联到任何特殊结构。
7.2.8 Internet数据类型
7.2.9 "Any"数据类型
7.3 程序数据的声明
7.3.1 声明一个变量
语法
name datatype [NOT NULL][:=| DEFAULT default_assignment];
变量声明中可以包含一个NOT NULL子句,有了这个子句后,如果没有为变量赋值,数据库就会抛出一个异常。
7.3.2 声明一个常量
声明一个变量和声明一个常量仅有两个区别:对于常量而言,你需要加上CONSTANT关键字。常量的值是在声明时设置的,并且一直不会改变。
name CONSTANT datatype [NOT NULL]:=| DEFAULT default_assignment;
7.3.4 锚定声明
所谓一个“锚定”的数据类型,就是告诉PL/SQL按照已经定义好的数据结构来设置变量的数据类型。
- 标量锚定:这种方法利用的是%TYPE属性,用这种方法定义的变量可以根据某个表中的一列或者其他的PL/SQL标量变量来定义变量类型。(一个)
-
记录锚定:这种方法利用的是%ROWTYPE属性,用这种个表的结构或者某个预定义的显示PL/SQL游标结构对变量的记录结构进行定义。(一组,有点像结构体的感觉)
variable name type attribute%TYPE [optional default value assignment]; variable name tablename | cursorname%ROWTYPE [optional default value assignment];
注意:对于错的引用的解释是在代码编译时刻进行的;锚本身不会有运行时刻的额外开销。
7.3.6 使用锚定声明的好处
- 和数据库列的同步
- 局部变量的标准化
7.3.7 NOT NULL数据类型的锚
当你声明变量时,你可以要求这个变量是NOT NULL的。如果其他变量是用这个变量的%TYPE属性声明的,那这个约束也会传递给这个新的变量。不过,如果%TYPE引用的源是一个NOT NULL的数据库列,情况就不是这样了。一个数据库表的NOT NULL约束不会自动地传递给变量。
7.4 程序员定义的子类型
- 有约束的子类型:这种子类型对原数据类型的取值做了限制或者约束。
- 没有约束的子类型:这种子类型并没有限制原始数据类型的取值范围。
要想使用一个子类型变量,你首先必须在匿名PL/SQL块,过程,函数或者包的声明单元声音这个子类型。
SUBTYPE subtype_name IS base_type;
7.5 数据类型的转换
- 隐式类型转换
- 显式类型转换
7.5.2 显式类型转换
- CHARTOROWID函数:把一个CHAR或者VARCHAR2类型的字符串转换成一个ROWID类型的值。
- CAST函数:它把一个内置的数据类型或者集合类型的数据转换成另外一个内置数据类型或者集合类型数据。
- CONVERT函数:把字符串从一个字符集转换成另一个字符集。