变量的数据类型

一. 标准类型

1.数值型

(1)十进制

类型 描述
number(数值长度,精度) 数值长度不写时,默认为38,精度正数为精确到小数点后几位,负数为精确到小数点前几位。
int 整数类型 小数位会自动四舍五入 —int(数值长度,精度) 整数型可以带有精度,也可以带有小数
float 浮点型(小数型),跟number一样,不能写精度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
declare
v_no number(5,2):=123.45;--数值长度剪掉精度是整数位的长度
v_no2 int(5,2) :=123.45;
v_no3 int :=123.55;
v_no4 float(7) :=123.45;
v_no5 float(7) :=555.55;
v_no6 float(7) :=456;
v_no7 float(10) :=456456;
begin
dbms_output.put_line(v_no);
dbms_output.put_line(v_no2);
dbms_output.put_line(v_no3);
dbms_output.put_line(v_no4);
dbms_output.put_line(v_no5);
dbms_output.put_line(v_no6);
dbms_output.put_line(v_no7);
end;

运行结果:

123.45
123.45
124
123
556
456
456500

(2)二进制

二进制的方式显示数值 –sql语句中没有,只能是整数
pls_integer –数值范围大于定义的数值范围时会报错
binary_integer –数值范围大于定义的数值范围时不会报错,会自动转成number

binary –二进制
integer –整数

2.字符型

–字符集 UTF-8
char(字节长度) –定长
varchar(字节长度) –变长
varchar2(字节长度) –变长

3.日期型

date
timestamp

declare
v_date date;
v_timestamp timestamp;
begin
–v_date :=sysdate;
–v_timestamp := sysdate;
v_date :=systimestamp;
v_timestamp := systimestamp;

dbms_output.put_line(v_date);
dbms_output.put_line(v_timestamp);
end;

4.布尔类型

Boolean –sql中没有
true –真
false –假
null –空
–布尔类型不能直接打印

5.属性类型

–数据类型不直接定义,而是从某一张表中的某一个字段上获取

语法: 变量名 表名.字段名%type;

声明一个变量,让他的数据类型等于emp表中的hiredate,输入员工编号,输出员工入职日期

1
2
3
4
5
6
declare 
v_hiredate emp.hiredate%type;
begin
select hiredate into v_hiredate from emp where empno=7369;
dbms_output.put_line(v_hiredate);
end;

声明一个变量,让他的数据类型等于emp表中的job,输入员工编号,输出员工岗位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
declare
v_job emp.job%type;
begin
select job into v_job from emp where empno=&员工编号;
dbms_output.put_line('该员工的岗位为'||v_job);
end;

declare
v_job emp.job%type;
v_empno emp.empno%type :=&员工编号;
begin
select job into v_job from emp where empno=v_empno;
dbms_output.put_line('该员工的岗位为'||v_job);
end;

二. 复合类型

记录型–指通过一个变量名记录一张表中的所有数据类型
语法: 变量名 表名%rowtype;

输入员工姓名,输出员工编号,姓名,薪资

1
2
3
4
5
6
declare
v_emp emp%rowtype;
begin
select * into v_emp from emp where ename = '&员工姓名';
dbms_output.put_line(v_emp.deptno||v_emp.ename||v_emp.sal);
end;

自定义型
语法: type 类型名 is record(字段名 数据类型,字段名 数据类型……);

输入员工姓名,输出员工编号,姓名,部门所在地

1
2
3
4
5
6
7
declare
type yuangong is record(bh number,xm varchar2(20),szd varchar2(20));
xiaohong yuangong;
begin
select empno,ename,loc into xiaohong from emp a join dept b on a.deptno = b.deptno where ename = '&员工姓名';
dbms_output.put_line(xiaohong.bh||xiaohong.xm||xiaohong.szd);
end;

–所有数据来源于一张表时,推荐用记录型,所有数据来源于多张表时,推荐用自定义型
–以下类型sql中均没有
3.表类型
4.可变数组

三. 参考类型

四. 大对象类型

blob 大型二进制
clob 字符大数据块
nclob 不区分中英文


select empno||deptno from emp;–两个number类型,用连接符连接在一块后算什么类型

习题

声明变量(日期型),当手动输入一个日期后,打印出这是本年的第几周 格式为’XX在本年的第Y周’
declare
v_date date :=to_date(‘&日期’,’yyyy-mm-dd’);
begin
dbms_output.put_line(v_date||’在本年的第’||to_char(v_date,’ww’)||’周’);
end;

打印出emp表中 薪资为5000 的员工姓名、薪资与部门名称
declare
v_ename varchar2(7);
v_sal number(5):=5000;
v_dname varchar2(10);
begin
select ename,sal,dname into v_ename,v_sal,v_dname from emp a join dept b on a.deptno=b.deptno where sal=5000;
dbms_output.put_line(v_ename||’ ‘||v_sal||’ ‘||v_dname);
end;

select ename,sal,dname from emp a join dept b on a.deptno=b.deptno and sal=5000;–on 跟 where 的区别

声明一个数值型变量v_deptno,输入赋值
查询并打印部门编号为v_deptno且在此部门内工资最低的员工姓名

declare
v_deptno number:=&部门编号;
v_ename varchar2(10);
begin
select ename
into v_ename
from (select ename
from emp
where sal in (select min(sal) from emp where deptno = v_deptno)
and deptno = v_deptno) where rownum =1;
dbms_output.put_line(‘部门编号’||v_deptno||’员工姓名’||v_ename);
end;

declare
v_deptno number:=&部门编号;
v_ename varchar2(10);
begin
select ename
into v_ename
from (select ename
from emp
where sal = 3000
and deptno = v_deptno) where rownum =1;
dbms_output.put_line(‘部门编号’||v_deptno||’员工姓名’||v_ename);
end;

思考题:
删除掉表内重复数据的方法?

select * from empa;

declare
v_deptno number:=&部门编号;
v_xingming varchar2(10);
begin
select ename into v_xingming from emp where (sal,deptno) in(select min(sal),deptno from emp where deptno=v_deptno group by deptno);
dbms_output.put_line(‘部门编号’||v_deptno||’员工姓名’||v_xingming);
end;

select ename from emp where (sal,deptno) in(select min(sal),deptno from emp where deptno=10 group by deptno);

declare
v_sal number;
begin
select sal into v_sal from emp where sal = 3000;–报错,实际返回的行数多于一行
dbms_output.put_line(v_sal);
end;

打印工资第5名的员工姓名
declare
v_ename varchar2(10);
begin
select ename into v_ename from (select ename,rownum r from (select * from emp order by sal desc))where r between 5 and 5;
dbms_output.put_line(‘姓名:’||v_ename);
end;

select ename into v_ename from (select ename,rownum paixu from (select * from emp order by sal desc)) where paixu = 5;

打印出KING的员工编号和入职时间(精确到天)和对应的部门名称
declare
v_empno number;
v_date date;
v_dname varchar2(10);
begin
select empno,hiredate,dname into v_empno,v_date,v_dname from emp A join dept B on A.deptno = B.deptno and A.ename = ‘KING’;
dbms_output.put_line(‘员工编号:’||v_empno||’,入职时间:’||v_date||’,部门名称:’||v_dname);
end;