pl/sql数据类型_%type

现在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;
/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值