PL/SQL的数据类型、变量以及常量的认识

文章目录

  • PL/SQL数据类型
    • 常见的数值数据类型
    • 常见的字符类型
    • 布尔数据类型
    • NULL
  • 常量
  • 两个属性类型
    • %TYPE
    • %rowtype

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 ; 

你可能感兴趣的:(Oracle&&PL/SQL)