现在pl/sql命令窗口中执行这段代码
--输入员工工号,计算个人所得税并输出
declare
c_tax_rate number(3,2):=0.03;
--用户名
v_ename varchar2(5);
v_sal number(7,2);
v_tax_sal number(7,2);
begin
--执行部分
select ename,sal into v_ename,v_sal from emp
where empno=&no;
--计算个人所得税
v_tax_sal:=v_sal*c_tax_rate;
--输出
dbms_output.put_line('姓名是:'||v_ename||',工资:'||v_sal||',个人所得税:'||v_tax_sal);
end;
如果我们输入一个员工工号是7654,那么会引发错误:ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
ORA-06512: 在 line 9
仔细分析这个原因:其实不难发现7654号员工的姓名是MARTIN他是六个字符,
而我们定义的v_ename 类型和大小是varchar(5)只有5个字符的变量,所以会错,
可是我们在执行之前,也不可能知道员工的姓名究竟是多少位,如果可变字符定义的过长不出错,可是浪费内存
所以要必要使用%type来解决这个问题。
%type的语法格式如下
标识符(变量名) 表名称.列名称%type;
这样就可以对定义用户名变量这一行做如下改动:
v_ename emp.ename%type;
它表示的意思就是用户名变量数据类型和大小和表中的当前用户名数据类型大小一致,
表中是五个可变字符的话,此处v_ename也就是五个可变字符
如果表中是六个可变字符的话,此处v_ename就是六个可变字符。
这样其他变量如果接收的是表中数据,定义也可以照这样去改
改后代码如下:
--输入员工工号,计算个人所得税并输出
declare
c_tax_rate number(3,2):=0.03;
--用户名
v_ename emp.ename%type;
v_sal emp.sal%type;
v_tax_sal number(7,2);
begin
--执行部分
select ename,sal into v_ename,v_sal from emp
where empno=&no;
--计算个人所得税
v_tax_sal:=v_sal*c_tax_rate;
--输出
dbms_output.put_line('姓名是:'||v_ename||',工资:'||v_sal||',个人所得税:'||v_tax_sal);
end;
/