PL/SQL - 数据类型



在本章中,我们将讨论 PL/SQL 中的数据类型。PL/SQL 变量、常量和参数必须具有有效的数据类型,该类型指定存储格式、约束和有效值范围。本章将重点介绍 **标量** 和 **LOB** 数据类型。其他两种数据类型将在其他章节中介绍。

序号 类别和描述
1

标量

没有内部组件的单个值,例如 **NUMBER**、**DATE** 或 **BOOLEAN**。

2

大型对象 (LOB)

指向存储在其他数据项之外的大型对象的指针,例如文本、图形图像、视频剪辑和声音波形。

3

复合

具有可以单独访问的内部组件的数据项。例如,集合和记录。

4

引用

指向其他数据项的指针。

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 位二进制数字(大约 18 位小数)

以下是一个有效的声明:

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 0 到 11
DAY 01 到 31(受月份和年份的值限制,根据区域设置的日历规则) 任何非零整数
HOUR 00 到 23 0 到 23
MINUTE 00 到 59 0 到 59
SECOND 00 到 59.9(n),其中 9(n) 是时间小数秒的精度 0 到 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 用于存储数据库外部操作系统文件中的大型二进制对象。 系统相关。不能超过 4 千兆字节 (GB)。
BLOB 用于存储数据库中的大型二进制对象。 8 到 128 太字节 (TB)
CLOB 用于存储数据库中大型字符数据块。 8 到 128 TB
NCLOB 用于存储数据库中大型 NCHAR 数据块。 8 到 128 TB

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,但不能将其与任何内容等同,包括自身。

广告