如何在PL/SQL中为数值添加百分比?报错问题求助
PL/SQL中为数值添加百分比的问题解决
问题描述
我不确定如何在PL/SQL中为现有数值添加5%,原以为像1000 + 10%这么简单,但实际并非如此。我编写了如下代码:
原代码
SET SERVEROUTPUT ON DECLARE v_sal emp.sal%TYPE; v_deptno emp.deptno%TYPE; BEGIN SELECT sal, deptno INTO v_sal, v_deptno FROM emp; LOOP IF v_deptno = 10 THEN v_sal + 5%; ELSIF v_deptno = 20 THEN v_sal + 7.5%; ELSIF v_deptno = 30 THEN v_sal + 10%; ELSE dbms_output.put_line('Deptno not found.'); END IF; UPDATE emp SET sal = v_sal WHERE deptno = v_deptno; EXIT; END LOOP; END; / SET SERVEROUTPUT OFF
错误信息
v_sal+5%; * ERROR at line 10: ORA-06550: line 10, column 10: PLS-00103: Encountered the symbol "+" when expecting one of the following: := . ( @ % ;
问题分析与修复
- 百分比写法错误:PL/SQL不支持直接用
%作为运算符号,5%要转换成小数0.05,所以给薪资加5%得写成v_sal := v_sal * 1.05(和v_sal := v_sal + v_sal * 0.05等价)。 - 缺少赋值操作:原代码里
v_sal + 5%只是个表达式,没把结果赋值给变量,必须用PL/SQL的赋值运算符:=来更新变量值。 - SELECT INTO的风险:如果
emp表有多条数据,SELECT ... INTO会抛出TOO_MANY_ROWS错误,因为这个语句只能接收一行数据。 - 无效循环:原代码的LOOP里直接写了
EXIT,循环只会执行一次,根本没起到遍历作用。
修复后的代码(用游标循环处理每行数据)
SET SERVEROUTPUT ON DECLARE CURSOR emp_cursor IS SELECT sal, deptno FROM emp; v_sal emp.sal%TYPE; v_deptno emp.deptno%TYPE; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_sal, v_deptno; EXIT WHEN emp_cursor%NOTFOUND; IF v_deptno = 10 THEN v_sal := v_sal * 1.05; -- 加5% ELSIF v_deptno = 20 THEN v_sal := v_sal * 1.075; -- 加7.5% ELSIF v_deptno = 30 THEN v_sal := v_sal * 1.1; -- 加10% ELSE dbms_output.put_line('部门编号 ' || v_deptno || ' 不存在'); CONTINUE; -- 跳过该部门的更新 END IF; UPDATE emp SET sal = v_sal WHERE deptno = v_deptno AND sal = v_sal / CASE v_deptno WHEN 10 THEN 1.05 WHEN 20 THEN 1.075 WHEN 30 THEN 1.1 ELSE 1 END; -- 避免重复更新已修改的数据 END LOOP; CLOSE emp_cursor; COMMIT; -- 提交更新 END; / SET SERVEROUTPUT OFF
更高效的批量更新方案
其实没必要用PL/SQL循环,直接一条UPDATE语句就能搞定,性能更好:
UPDATE emp SET sal = CASE deptno WHEN 10 THEN sal * 1.05 WHEN 20 THEN sal * 1.075 WHEN 30 THEN sal * 1.1 ELSE sal -- 其他部门薪资不变 END WHERE deptno IN (10,20,30); -- 只更新指定部门 COMMIT;
内容的提问来源于stack exchange,提问作者NoMansLand
相关产品推荐
相关产品推荐

