PL/SQL数据类型
标量(SCALAR)类型 - 它是没有内部组件的单个值,例如:NUMBER,DATE或BOOLEAN等。
大对象(LOB)类型 - 指向与其他数据项(例如:文本,图形图像,视频剪辑和声音波形)分开存储的大对象的指针。
复合类型 - 具有可单独访问的内部组件的数据项。例如,集合和记录。
引用类型 - 指向其他数据项。
序号 | 类型 | 描述 |
---|---|---|
1 | 数字 | 执行算术运算的数值 |
2 | 字符 | 表示单个字符或字符串的字母数字值 |
3 | 布尔 | 执行逻辑运算的逻辑值 |
4 | 日期时间 | 用于表示日期和时间的值 |
常见的数值数据类型
序号 | 类型 | 描述 |
---|---|---|
1 | FLOAT | ANSI和IBM特定浮点类型,最大精度为126位二进制数字(大约38位十进制数字) |
2 | INT | ANSI特定整数类型,最大精度为38位十进制数 |
3 | INTEGER | ANSI和IBM特定整数类型,最大精度为38位十进制数 |
4 | SMALLINT | ANSI和IBM特定整数类型,最大精度为38位十进制数 |
常见的字符类型
序号 | 类型 | 描述 |
---|---|---|
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 | 通用行标识符(物理,逻辑或外部行标识符) |
何时该用CHAR,何时该用varchar2?
CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系.
VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。
VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。
布尔数据类型
BOOLEAN数据类型存储逻辑运算中使用的逻辑值。逻辑值为布尔值:TRUE,FALSE以及NULL值。
NULL
PL/SQL中的NULL值表示丢失或未知数据,它们不是整数,字符或任何其他特定数据类型。 请注意,NULL与空数据字符串或空字符值\0不同。
判断是否为0
select 1 from dual where nvl(null,0) is not null;
空字符串也为null
select 1 from dual where '' is null
null是不能被%匹配到的
select 1 from dual where null like '%'是查不到结果的
常量
使用CONSTANT关键字声明常量。它需要初始值,不允许在声明后更改该值
PI CONSTANT NUMBER := 3.141592654;
DECLARE
-- constant declaration
pi constant number := 3.141592654;
-- other declarations
radius number(5,2);
dia number(5,2);
circumference number(7, 2);
area number (10, 2);
BEGIN
-- processing
radius := 9.5;
dia := radius * 2;
circumference := 2.0 * pi * radius;
area := pi * radius * radius;
-- output
dbms_output.put_line('半径: ' || radius);
dbms_output.put_line('直径: ' || dia);
dbms_output.put_line('圆周: ' || circumference);
dbms_output.put_line('面积: ' || area);
END;
两个属性类型
%TYPE
定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE。
说白了就是将查询到的某个列的结果要赋给 一个变量这会就用到了 %TYPE
---查询员工号为7369的补助
declare
empcom emp.comm%type ; --声明一个empcom变量
begin
select comm into empcom from emp where empno=7369 ;---将查到的comm类型的结果值放到 empcom变量里
dbms_output.put_line('员工补助是'||empcom) ;--- ||是连接字符用到
end ;
declare 声明部分定义了一个empcom 变量它的类型是 emp的comm属性,意味着 后边的程序将列值取出赋值给empcom 变量。
select comm into empcom from emp where empno=7369 ;
select … into… 表示将 查询结果 赋给 empcom 。
%rowtype
PL/SQL 提供%ROWTYPE操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致。
使用%ROWTYPE特性的优点在于:
所引用的数据库中列的个数和数据类型可以不必知道;
所引用的数据库中列的个数和数据类型可以实时改变。
取出一个列的记录可以存到使用rowtype 定义的变量里。
---查询king员工的所有信息。 %rowtype 使用
declare
empmsg emp%rowtype ; -- 定义一个empmsg变量 存一行的数据
begin
select * into empmsg from emp where ename ='KING' ;
dbms_output.put_line(empmsg.ename||':'||empmsg.sal) ; ---输出
end ;