PL/SQL - 数据类型
在本章中,我们将讨论 PL/SQL 中的数据类型。 PL/SQL 变量、常量和参数必须具有有效的数据类型,它指定存储格式、约束和有效值范围。 在本章中,我们将重点介绍 SCALAR 和 LOB 数据类型。 其他两种数据类型将在其他章节中介绍。
S.No | Category & Description |
---|---|
1 | Scalar 没有内部组件的单个值,例如 NUMBER、DATE 或 BOOLEAN。 |
2 | Large Object (LOB) 指向与其他数据项(例如文本、图形图像、视频剪辑和声音波形)分开存储的大型对象的指针。 |
3 | Composite 具有可单独访问的内部组件的数据项。 例如,集合和记录。 |
4 | Reference 指向其他数据项的指针。 |
PL/SQL 标量数据类型和子类型
PL/SQL 标量数据类型和子类型属于以下类别 −
S.No | Date Type & Description |
---|---|
1 | Numeric 对其执行算术运算的数值。 |
2 | Character 表示单个字符或字符串的字母数字值。 |
3 | Boolean 对其执行逻辑操作的逻辑值。 |
4 | Datetime 日期和时间。 |
PL/SQL 提供了数据类型的子类型。 例如,数据类型 NUMBER 有一个称为 INTEGER 的子类型。 您可以在 PL/SQL 程序中使用子类型来使数据类型与其他程序中的数据类型兼容,同时将 PL/SQL 代码嵌入到另一个程序中,例如 Java 程序。
PL/SQL 数值数据类型和子类型
下表列出了 PL/SQL 预定义的数值数据类型及其子类型 −
S.No | 数据类型与描述 |
---|---|
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 预定义字符数据类型及其子类型的详细信息 −
S.No | 数据类型与描述 |
---|---|
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 to 12 | 0 to 11 |
DAY | 01 到 31(受 MONTH 和 YEAR 的值限制,根据 locale 的日历规则) | 任意非零整数 |
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' 不同。 可以分配一个空值,但它不能等同于任何东西,包括它自己。