在本章中,我们将讨论和学习PL/SQL中的数据类型。 PL/SQL变量,常量和参数必须具有有效的数据类型,它指定存储格式,约束和有效的值范围。本节将重点介绍SCALAR
和LOB
数据类型。其他两个数据类型(复合类型和引用类型)将在后面的章节中介绍。
- 标量(SCALAR)类型 – 它是没有内部组件的单个值,例如:
NUMBER
,DATE
或BOOLEAN
等。 - 大对象(LOB)类型 – 指向与其他数据项(例如:文本,图形图像,视频剪辑和声音波形)分开存储的大对象的指针。
- 复合类型 – 具有可单独访问的内部组件的数据项。例如,集合和记录。
- 引用类型 – 指向其他数据项。
PL/SQL标量数据类型和子类型
PL/SQL标量数据类型和子类型分为以下几类:
序号 | 类型 | 描述 |
---|---|---|
1 | 数字 | 执行算术运算的数值。 |
2 | 字符 | 表示单个字符或字符串的字母数字值。 |
3 | 布尔 | 执行逻辑运算的逻辑值。 |
4 | 日期时间 | 用于表示日期和时间的值 |
PL/SQL提供了数据类型的子类型。例如,NUMBER
数据类型具有一个叫作INTEGER
的子类型。 您可以使用PL/SQL程序中的子类型将数据类型与其他程序中的数据类型兼容,同时将PL/SQL代码嵌入到另一个程序(如Java程序)中。
PL/SQL数值数据类型和子类型
下表列出了PL/SQL预定义的数字数据类型及其子类型 –
序号 | 类型 | 描述 |
---|---|---|
1 | PLS_INTEGER | 带符号整数:-2,147,483,648 至2,147,483,647 ,以32 位表示 |
2 | BINARY_INTEGER | 带符号整数:-2,147,483,648 至2,147,483,647 ,以32 位表示 |
3 | BINARY_FLOAT | 单精度IEEE 754 格式浮点数 |
4 | BINARY_DOUBLE | 双精度IEEE 754 格式浮点数 |
5 | NUMBER(prec, scale) | 在1E-130 到(但不包括)1.0E126 范围内的绝对值的定点或浮点数。NUMBER 变量也可以表示0 |
6 | DEC(prec, scale) | ANSI特定定点类型,最大精度为38 位十进制数字 |
7 | DECIMAL(prec, scale) | IBM具体定点类型,最大精度为38 位十进制数字 |
8 | NUMERIC(pre, secale) | 浮点型,最大精度为38 位十进制数 |
9 | DOUBLE PRECISION | ANSI特定浮点类型,最大精度为126 位二进制数字(大约38位十进制数字) |
10 | FLOAT | ANSI和IBM特定浮点类型,最大精度为126 位二进制数字(大约38 位十进制数字) |
11 | INT | ANSI特定整数类型,最大精度为38 位十进制数 |
12 | INTEGER | ANSI和IBM特定整数类型,最大精度为38 位十进制数 |
13 | SMALLINT | ANSI和IBM特定整数类型,最大精度为38 位十进制数 |
14 | REAL | 浮点型,最大精度为63 位二进制数字(约十八位数) |
以下是有效的声明 –
DECLARE
num1 INTEGER;
num2 REAL;
num3 DOUBLE PRECISION;
BEGIN
null;
END;
/
当上述代码编译和执行时,它产生以下结果 –
PL/SQL procedure successfully completed
PL/SQL字符数据类型和子类型
以下是PL/SQL预定义字符数据类型及其子类型的详细信息 –
序号 | 类型 | 描述 |
---|---|---|
1 | CHAR | 固定长度字符串,最大大小为32,767 字节 |
2 | VARCHAR2 | 最大大小为32,767 字节的可变长度字符串 |
3 | RAW | 最大大小为32,767 字节的可变长度二进制或字节字符串,不由PL/SQL解释 |
4 | NCHAR | 固定长度的国家字符串,最大大小为32,767 字节 |
5 | NVARCHAR2 | 可变长度的国家字符串,最大大小为32,767 字节 |
6 | LONG | 最大长度为32,760 字节的可变长度字符串 |
7 | LONG RAW | 最大大小为32,760 字节的可变长度二进制或字节字符串,不由PL/SQL解释 |
8 | ROWID | 物理行标识符,普通表中的行的地址 |
9 | UROWID | 通用行标识符(物理,逻辑或外部行标识符) |
PL/SQL布尔数据类型
BOOLEAN
数据类型存储逻辑运算中使用的逻辑值。逻辑值为布尔值:TRUE
,FALSE
以及NULL
值。
但是,SQL没有类似于BOOLEAN
的数据类型。 因此,布尔值不能用于 –
- SQL语句
- 内置SQL函数(如:
TO_CHAR
) - 从SQL语句调用PL/SQL函数
PL/SQL日期时间和间隔类型
DATE
数据类型用于存储固定长度的数据日期时间,其包括自午夜以来以秒为单位的时间。 有效期为公元前4712年1月1日至公元9999年12月31日。
默认日期格式由Oracle初始化参数NLS_DATE_FORMAT
设置。 例如,默认值可能是“DD-MON-YY”
,其中包括一个月份的两位数字,月份名称的缩写以及年份的最后两位数字。 例如,01-OCT-12
。
每个DATE
类型的数据值包括世纪,年,月,日,时,分,秒。下表显示每个字段的有效值 –
字段名 | 有效的日期时间值 | 有效间隔值 |
---|---|---|
YEAR | -4712 至9999 (不包括第0 年) | 任意非零整数 |
MONTH | 01 ~ 12 | 01 ~ 11 |
DAY | 01 至31 (限于MONTH 和YEAR 的值,根据本地日历的规则) | 任何非零整数 |
HOUR | 00 ~ 23 | 00 ~ 23 |
MINUTE | 00 ~ 59 | 00 ~ 59 |
SECOND | 00 ~ 59.9(n) ,其中9(n) 是时间分秒的精度 | 00 ~ 59.9(n) ,其中9(n) 是间隔分数秒的精度 |
TIMEZONE_HOUR | -12 至14 (范围适应夏令时更改) | 不适用 |
TIMEZONE_MINUTE | 00 ~ 59 | 不适用 |
TIMEZONE_REGION | 在动态性能视图V$TIMEZONE_NAMES 找到 | 不适用 |
TIMEZONE_ABBR | 在动态性能视图V$TIMEZONE_NAMES 找到 | 不适用 |
PL/SQL大对象(LOB)数据类型
大对象(LOB)数据类型指的是大数据项,如文本,图形图像,视频剪辑和声音波形。 LOB数据类型允许对数据进行高效,随机,分段访问。以下是预定义的PL/SQL LOB数据类型 –
数据类型 | 描述 | 大小 |
---|---|---|
BFILE | 用于在数据库外的操作系统文件中存储大型二进制对象。 | 取决于系统,但不得超过4GB 。 |
BLOB | 用于在数据库中存储的大型二进制对象 | 8TB 至128TB |
CLOB | 用于在数据库中存储大字符数据。 | 8TB 至128TB |
NCLOB | 用于在数据库中存储大块NCHAR 数据。 | 8TB 至128TB |
PL/SQL用户定义的子类型
子类型是另一种数据类型的子集,它称为基本类型。子类型具有与其基本类型相同的操作,但只有基本类型有效值的子集。
PL/SQL预定义包STANDARD
中的几个子类型。 例如,PL/SQL预先定义子类型CHARACTER
和INTEGER
,如下所示:
SUBTYPE CHARACTER IS CHAR;
SUBTYPE INTEGER IS NUMBER(38,0);
可以定义和使用自己的子类型。以下程序说明了如何定义和使用用户定义的子类型 –
DECLARE
SUBTYPE name IS char(20);
SUBTYPE message IS varchar2(100);
salutation name;
greetings message;
BEGIN
salutation := 'Reader ';
greetings := 'Welcome to the World of PL/SQL';
dbms_output.put_line('Hello ' || salutation || greetings);
END;
/
当上述代码在SQL提示符下执行时,它会产生以下结果 –
Hello Reader Welcome to the World of PL/SQL
PL/SQL procedure successfully completed.
PL/SQL中的NULL
PL/SQL中的NULL
值表示丢失或未知数据,它们不是整数,字符或任何其他特定数据类型。 请注意,NULL
与空数据字符串或空字符值\0
不同。可以将一个null
值分配给其它变量,但不能等同于任何东西,包括其自身(null
)。