对scott模式emp表中的员工工资进行薪资调整,并将调整前后的数据在控制台输出,输出格式为“员工姓名:%empname%,员工编号:%empno%,所在部门编号:%deptno%,原工资:%oldsalary%,调整后工资:%newsalary%”
时间: 2025-05-27 13:35:20 浏览: 21
### 更新员工薪资并输出调整前后数据
为了完成此操作,可以通过编写PL/SQL脚本实现。该脚本会先记录原始薪资信息,然后更新薪资,并最终将调整前后的数据格式化输出到控制台。
以下是完整的解决方案:
#### PL/SQL 脚本
```sql
DECLARE
CURSOR emp_cursor IS SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP;
v_empno EMP.EMPNO%TYPE;
v_ename EMP.ENAME%TYPE;
v_deptno EMP.DEPTNO%TYPE;
v_old_sal EMP.SAL%TYPE;
v_new_sal EMP.SAL%TYPE;
BEGIN
FOR emp_record IN emp_cursor LOOP
v_empno := emp_record.EMPNO;
v_ename := emp_record.ENAME;
v_deptno := emp_record.DEPTNO;
v_old_sal := emp_record.SAL;
-- 假设我们将薪资增加10%
v_new_sal := v_old_sal * 1.10;
-- 输出调整前后的数据
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || RPAD(v_ename, 15) ||
' Employee No.: ' || LPAD(v_empno, 5, '0') ||
' Dept No.: ' || LPAD(v_deptno, 3, '0') ||
' Old Salary: ' || TO_CHAR(v_old_sal, '$99,999.99') ||
' New Salary: ' || TO_CHAR(v_new_sal, '$99,999.99'));
-- 更新薪资
UPDATE EMP SET SAL = v_new_sal WHERE EMPNO = v_empno;
END LOOP;
END;
/
```
#### 解释
- **游标定义**:`CURSOR emp_cursor`用于遍历`EMP`表中的每一行数据。
- **变量声明**:分别定义了存储员工编号、姓名、部门编号以及旧新薪资的变量。
- **薪资调整逻辑**:假设薪资增加了10%,可以根据实际需求修改这一比例[^4]。
- **格式化输出**:使用`DBMS_OUTPUT.PUT_LINE`函数将调整前后的数据以指定格式打印到控制台。其中:
- `RPAD` 和 `LPAD` 函数用于填充字符宽度,使输出整齐美观。
- `TO_CHAR` 函数用于将数值转化为货币格式显示。
- **更新操作**:通过`UPDATE`语句将新的薪资保存回数据库。
---
### 数据库完整性与一致性注意事项
在执行批量更新时,应考虑事务管理以确保数据一致性和完整性。如果发生异常情况(如部分更新失败),可通过回滚机制恢复初始状态[^3]。
例如,在脚本开头加入`SAVEPOINT start_point;`,并在可能抛出异常的位置捕获错误后调用`ROLLBACK TO SAVEPOINT start_point;`。
---
### SQL 性能优化建议
对于大规模数据处理,需注意以下几点性能优化策略:
1. 使用索引加速查询速度,特别是针对频繁访问的字段(如`EMPNO`, `DEPTNO`)。
2. 避免全表扫描,尽量基于主键或其他高效过滤条件检索目标记录。
3. 如果涉及复杂计算或聚合操作,则可引入物化视图缓存中间结果[^1]。
---
阅读全文
相关推荐













