在本章中,我们将讨论和学习pl/sql中的数据类型。 pl/sql变量,常量和参数必须具有有效的数据类型,它指定存储格式,约束和有效的值范围。本节将重点介绍scalar和lob数据类型。其他两个数据类型(复合类型和引用类型)将在后面的章节中介绍。
number,date或boolean等。pl/sql标量数据类型和子类型分为以下几类:
| 序号 | 类型 | 描述 |
|---|---|---|
| 1 | 数字 | 执行算术运算的数值。 |
| 2 | 字符 | 表示单个字符或字符串的字母数字值。 |
| 3 | 布尔 | 执行逻辑运算的逻辑值。 |
| 4 | 日期时间 | 用于表示日期和时间的值 |
pl/sql提供了数据类型的子类型。例如,number数据类型具有一个叫作integer的子类型。 您可以使用pl/sql程序中的子类型将数据类型与其他程序中的数据类型兼容,同时将pl/sql代码嵌入到另一个程序(如java程序)中。
下表列出了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预定义字符数据类型及其子类型的详细信息 -
| 序号 | 类型 | 描述 |
|---|---|---|
| 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 |
通用行标识符(物理,逻辑或外部行标识符) |
boolean数据类型存储逻辑运算中使用的逻辑值。逻辑值为布尔值:true,false以及null值。
但是,sql没有类似于boolean的数据类型。 因此,布尔值不能用于 -
to_char)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找到 |
不适用 |
大对象(lob)数据类型指的是大数据项,如文本,图形图像,视频剪辑和声音波形。 lob数据类型允许对数据进行高效,随机,分段访问。以下是预定义的pl/sql lob数据类型 -
| 数据类型 | 描述 | 大小 |
|---|---|---|
bfile |
用于在数据库外的操作系统文件中存储大型二进制对象。 | 取决于系统,但不得超过4gb。 |
blob |
用于在数据库中存储的大型二进制对象 | 8tb至128tb |
clob |
用于在数据库中存储大字符数据。 | 8tb至128tb |
nclob |
用于在数据库中存储大块nchar数据。 |
8tb至128tb |
子类型是另一种数据类型的子集,它称为基本类型。子类型具有与其基本类型相同的操作,但只有基本类型有效值的子集。
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值表示丢失或未知数据,它们不是整数,字符或任何其他特定数据类型。 请注意,null与空数据字符串或空字符值\0不同。可以将一个null值分配给其它变量,但不能等同于任何东西,包括其自身(null)。