数据类型本质上是一种用于描述数据存储的内存结构,用它来决定变量中所存储数据的类型。
变量本质上是一种用名称进行识别的标示符号,它可以存储不同类型的数据。
根据不同的数据类型,定义不同名称的变量,这样就可以存储不同类型的数据。
变量在程序运行的过程中,其值可以发生变化,与变量对应的就是常量,常量就是指在程序运行的过程中,其值不会发生变化的量。
1.1.1 基本数据类型
(1)数值类型
数值类型主要包括NUMBER、PLS_INTEGER和BINARY_INTEGER三种基本类型。
PL/SQL语言出于代码可读性或与来自其他编程语言的数据类型相兼容的考虑,提出了“子类型”的概念,所谓子类型就是与NUMBER类型等价的类型别名,甚至可以说是NUMBER类型的多种重命名形式。
这些等价的子类型主要包括
(2)字符类型
字符类型主要包括VARCHAR2、CHAR、LONG、NCHAR和NVARCHAR2等。这些类型的变量用来存储字符串或字符数据。
VARCHAR2(maxlength)CHAR(maxlength)(3)日期类型
日期类型只有一种—DATE类型,用来存储日期和时间信息,DATE类型的存储空间是7个字节,分别使用一个字节存储世纪、年、月、天、小时、分钟和秒。
(4)布尔类型
布尔类型也只有一种—即BOOLEAN,主要用于程序的流程控制和业务逻辑判断,其变量值可以是TRUE、FALSE或NULL中的一种。
1.1.2 特殊数据类型
(1)%TYPE类型
使用%TYPE关键字可以声明一个与指定列相同的数据类型,它通常紧跟在指定列名的后面。
//声明一个和users表中的name字段相同数据类型的_name变量
declare
var _name users.name%type;
使用%TYPE定义变量有两个好处:
另外,在上面代码中使用into子句,它位于select子句的后面,用于设置将从数据库检索的数据存储到哪个变量中。由于into子句中的变量只能存储一个单独的值,所以要求select子句只能返回一行数据,这个由where子句进行了限定。若SELECT子句返回多行数据,则代码运行后会返回错误信息。
(2)RECORD类型
单词RECORD有“记录”之意,因此RECORD类型也称作“记录类型”,使用该类型的变量可以存储由多个列值组成的一行数据。
在声明记录类型变量之前,首先需要定义记录类型,然后才可以声明记录类型的变量。记录类型是一种结构化的数据类型,它使用type语句进行定义,在记录类型的定义结构中包含成员变量及其数据类型,其语法格式如下。
type record_type is record
(
var_member1 data_type [not null] [:=default_value],
…
var_membern data_type [not null] [:=default_value]
)
从上面的语法结构中可以看出,记录类型的声明类似于C或C++中的结构类型,并且成员变量的声明与普通PL/SQL变量的声明相同。
示例

(3)%ROWTYPE类型
%ROWTYPE类型的变量结合了“%TYPE类型”和“记录类型”变量的优点,它可以根据数据表中行的结构定义一种特殊的数据类型,用来存储从数据表中检索到的一行数据。
语法形式为:
rowVar_name table_name%rowtype;
在上面的语法结构中,可以不恰当地把table_name%rowtype看做是一种能够存储表中一行数据的特殊类型。
1.2.1 定义变量
变量是指其值在程序运行过程中可以改变的数据存储结构,定义变量必需的元素就是变量名和数据类型,另外还有可选择的初始值,其标准语法格式如下:
<变量名> <数据类型> [(长度):=<初始值>];
与很多面向对象的编程语言不同,PL/SQL中的变量定义要求变量名在数据类型的前面,而不是后面;语法中的长度和初始值是可选项,需要根据实际情况而定。
var_name varchar2(50) := '张三';
1.2.2 定义常量
常量是指其值在程序运行过程中不可改变的数据存储结构,定义常量必需的元素包括常量名、数据类型、常量值和constant关键字,其标准语法格式如下:
<常量名> constant <数据类型>:=<常量值>;
对于一些固定的数值,比如圆周率、光速等,为了防止其不慎被改变,最好定义成常量。
con_age constant integer := 18;
1.2.3 变量初始化
许多语言没有规定未经过初始化的变量中应该存放什么内容,因此在运行时,未初始化的变量就可能包含随机的或者未知的取值。在一种语言中,运行使用未初始化变量并不是一种很好的编程风格。一般而言,如果变量的取值可以被确定,那么最好为其初始化一个数值。
但是,PL/SQL定义了一个未初始化变量应该存放的内容,其被赋值为NULL。NULL意味着“未定义或未知的取值”。换句话讲,NULL可以被默认地赋值给任何未经过初始化的变量。这是PL/SQL的一个独到之处,许多其他程序设计语言没有定义未初始化变量的取值。
1.3.1 PL/SQL表达式 介绍
表达式不能独立构成语句,表达式的结果是一个值,如果不给这个值安排一个存放的位置,则表达式本身毫无意义。通常,表达式作为赋值语句的一部分出现在赋值运算符的右边,或者作为函数的参数等。
例如,123*23-24+33就是一个表达式,它是由运算符串连起来的一组数,按照运算符的意义运算会得到一个运算结果,这就是表达式的值。
操作数”是运算符的参数。根据所拥有的参数个数,PL/SQL运算符可分为一元运算符(一个参数)和二元运算符(两个参数)。表达式按照操作对象的不同,也可以分为字符表达式和布尔表达式两种。
1.3.2 字符表达式
唯一的字符运算符就是并置运算符“||”,它的作用是把几个字符串连在一起,如:
'Hello' || 'World' || '!' 的值等于 'Hello World!'
1.3.3 布尔表达式
PL/SQL控制结构都涉及布尔表达式。布尔表达式是一个判断结果为真还是为假的条件,它的值只有TRUE、FALSE或NULL,如以下表达式所示。
(x > y);
NULL;
(4 > 5) OR ( -1 < 0);
布尔表达式有3个布尔运算符:AND、OR和NOT,与高级语言中的逻辑运算符一样,它们的操作对象是布尔变量或者表达式。如:
A AND B OR 1 NOT C
其中,A、B、C都是布尔变量或者表达式。表达式TRUE AND NULL的值为NULL,因为不知道第二个操作数是否为TRUE。
| 操作符 | 说明 |
|---|---|
| = | 等于 |
| != | 不等于 |
| < | 小于 |
| > | 大于 |
| <= | 小于等于 |
| >= | 大于等于 |
此外,between操作符可以划定一个范围,在范围内则为真,否则为假。如:
1 between 0 and 100 表达式的值为真。
IN操作符判断某一元素是否属于某个集合,如:
'Scott'IN('Mike','Jone','Mary') 的结果为假。
参考文献: