变量的数据类型
变量的数据类型
一. 标准类型
1.数值型
(1)十进制
类型 | 描述 |
---|---|
number(数值长度,精度) | 数值长度不写时,默认为38,精度正数为精确到小数点后几位,负数为精确到小数点前几位。 |
int | 整数类型 小数位会自动四舍五入 —int(数值长度,精度) 整数型可以带有精度,也可以带有小数 |
float | 浮点型(小数型),跟number一样,不能写精度 |
1 | declare |
运行结果:
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 | declare |
声明一个变量,让他的数据类型等于emp表中的job,输入员工编号,输出员工岗位
1 | declare |
二. 复合类型
记录型–指通过一个变量名记录一张表中的所有数据类型
语法: 变量名 表名%rowtype;
输入员工姓名,输出员工编号,姓名,薪资
1 | declare |
自定义型
语法: type 类型名 is record(字段名 数据类型,字段名 数据类型……)
;
输入员工姓名,输出员工编号,姓名,部门所在地
1 | declare |
–所有数据来源于一张表时,推荐用记录型,所有数据来源于多张表时,推荐用自定义型
–以下类型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;