Plsql 简明教程
PL/SQL - Data Types
本章中,我们将讨论 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 Scalar Data Types and Subtypes
PL/SQL 标量数据类型和子类型属于以下类别 −
S.No |
Date Type & Description |
1 |
执行算术运算的 Numeric 数值。 |
2 |
表示单个字符或字符字符串的 Character 字母数字值。 |
3 |
执行逻辑运算的 Boolean 逻辑值。 |
4 |
Datetime Dates and times. |
PL/SQL 提供数据类型的子类型。例如,数据类型 NUMBER 具有名为 INTEGER 的子类型。在将 PL/SQL 代码嵌入到其他程序(例如 Java 程序)时,可以在 PL/SQL 程序中使用子类型来使数据类型与其他程序中的数据类型兼容。
PL/SQL Numeric Data Types and Subtypes
下表列出了 PL/SQL 预定义的数值数据类型及其子类型 −
S.No |
Data Type & Description |
1 |
用 32 位表示的,范围在 -2,147,483,648 到 2,147,483,647 之间的带符号整数 |
2 |
用 32 位表示的,范围在 -2,147,483,648 到 2,147,483,647 之间的带符号整数 |
3 |
IEEE 754 格式的单精度浮点数 |
4 |
IEEE 754 格式的双精度浮点数 |
5 |
NUMBER(prec, scale) 绝对值为 1E-130 至 (但不包括) 1.0E126 的定点数或浮点数。NUMBER 变量还可以表示 0 |
6 |
DEC(prec, scale) 最大精度为 38 位十进制数字的 ANSI 特定定点类型 |
7 |
DECIMAL(prec, scale) 最大精度为 38 位十进制数字的 IBM 特定定点类型 |
8 |
NUMERIC(pre, secale) 最大精度为 38 位十进制数字的浮点类型 |
9 |
DOUBLE PRECISION 最大精度为 126 位二进制数字(约 38 位十进制数字)的 ANSI 特定浮点类型 |
10 |
FLOAT 最大精度为 126 位二进制数字(约 38 位十进制数字)的 ANSI 和 IBM 特定浮点类型 |
11 |
INT 最大精度为 38 位十进制数字的 ANSI 特定整数类型 |
12 |
INTEGER 最大精度为 38 位十进制数字的 ANSI 和 IBM 特定整数类型 |
13 |
SMALLINT 最大精度为 38 位十进制数字的 ANSI 和 IBM 特定整数类型 |
14 |
REAL 最大精度为 63 位二进制数字(约 18 位十进制数字)的浮点类型 |
以下是一个有效的声明 −
DECLARE
num1 INTEGER;
num2 REAL;
num3 DOUBLE PRECISION;
BEGIN
null;
END;
/
编译并执行上述代码后,将产生以下结果 −
PL/SQL procedure successfully completed
PL/SQL Character Data Types and Subtypes
以下是 PL/SQL 预定义字符数据类型及其子类型 −
S.No |
Data Type & Description |
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 Data Types
BOOLEAN 数据类型存储在逻辑运算中使用的逻辑值。逻辑值为布尔值 TRUE 和 FALSE 以及值 NULL 。
然而,SQL 没有等同于 BOOLEAN 的数据类型。因此,布尔值不能在 − 中使用
-
SQL statements
-
内置 SQL 函数(如 TO_CHAR )
-
从 SQL 语句调用的 PL/SQL 函数
PL/SQL Datetime and Interval Types
DATE 数据类型用于存储固定长度日期时间,其中包括自午夜以来的时间(以秒为单位)。有效的日期范围是从公元前 4712 年 1 月 1 日到公元 9999 年 12 月 31 日。
默认日期格式由 Oracle 初始化参数 NLS_DATE_FORMAT 设置。例如,默认可能为“DD-MON-YY”,其中包括一个用于表示当月日期的两位数字、月份名称的缩写以及该年的最后两位数字。例如,01-OCT-12。
每个 DATE 包含世纪、年、月、日、小时、分钟和秒。下表显示了每个字段的有效值 −
Field Name |
Valid Datetime Values |
Valid Interval Values |
YEAR |
-4712 到 9999(不包括公元 0 年) |
Any nonzero integer |
MONTH |
01 to 12 |
0 to 11 |
DAY |
01 到 31(受 MONTH 和 YEAR 的值限制,根据该国家/地区的日历规则) |
Any nonzero integer |
HOUR |
00 to 23 |
0 to 23 |
MINUTE |
00 to 59 |
0 to 59 |
SECOND |
00 到 59.9(n),其中 9(n) 是时间分数秒的精度 |
0 到 59.9(n),其中 9(n) 是间隔分数秒的精度 |
TIMEZONE_HOUR |
-12 到 14(此范围适应夏令时变更) |
Not applicable |
TIMEZONE_MINUTE |
00 to 59 |
Not applicable |
TIMEZONE_REGION |
在动态性能视图 V$TIMEZONE_NAMES 中找到 |
Not applicable |
TIMEZONE_ABBR |
在动态性能视图 V$TIMEZONE_NAMES 中找到 |
Not applicable |
PL/SQL Large Object (LOB) Data Types
大型对象 (LOB) 数据类型是指大型数据项,例如文本、图形图像、视频剪辑和声音波形。LOB 数据类型允许高效、随机、分块访问这些数据。以下是预定义的 PL/SQL LOB 数据类型 −
Data Type |
Description |
Size |
BFILE |
用于将大型二进制对象存储在数据库外部的操作系统文件中。 |
系统相关。不能超过 4 千兆字节 (GB)。 |
BLOB |
用于在数据库中存储较大的二进制对象。 |
8 到 128 太字节 (TB) |
CLOB |
用于在数据库中存储较大的字符数据块。 |
8 to 128 TB |
NCLOB |
用于在数据库中存储较大的 NCHAR 数据块。 |
8 to 128 TB |
PL/SQL User-Defined Subtypes
子类型是其他数据类型的子集,后者称为其基础类型。子类型具有与其基础类型相同有效的操作,但其有效值仅为其子集。
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.