1. 编写PL/SQL,利用游标,对scott方案下emp表中某个部门的雇员涨工资,部门号及涨工资比例均由手动输入。如果输入部门号不存在,或涨工资比例大于50%,均捕获异常输出相应出错提示信息。 2. 编写存储过程,要求输入部门编号,输出scott.emp表中该部门所有职工的职工编号、姓名、工作岗位。 3. 编写函数,要求将scott.emp表中低于平均工资的职工工资加上200,并返回修改了工资的总人数。
时间: 2024-02-15 22:01:48 浏览: 104
好的,我会尽力回答你的问题。下面是我的回答:
1. PL/SQL代码如下:
```
DECLARE
v_deptno emp.deptno%TYPE;
v_raise_pct NUMBER(3,2);
CURSOR c_emp IS SELECT * FROM emp WHERE deptno = v_deptno FOR UPDATE OF sal;
BEGIN
v_deptno := &deptno;
v_raise_pct := &raise_pct;
IF v_raise_pct > 0.5 THEN
RAISE_APPLICATION_ERROR(-20001,'涨工资比例不能大于50%');
END IF;
OPEN c_emp;
LOOP
FETCH c_emp INTO emp_rec;
EXIT WHEN c_emp%NOTFOUND;
UPDATE emp SET sal = sal * (1 + v_raise_pct) WHERE CURRENT OF c_emp;
END LOOP;
CLOSE c_emp;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20002,'部门号不存在');
END;
```
2. 存储过程代码如下:
```
CREATE OR REPLACE PROCEDURE get_emp_by_deptno(p_deptno IN emp.deptno%TYPE)
IS
BEGIN
SELECT empno, ename, job
FROM emp
WHERE deptno = p_deptno;
END;
```
3. 函数代码如下:
```
CREATE OR REPLACE FUNCTION raise_low_salary_emp
RETURN NUMBER
IS
v_avg_sal emp.sal%TYPE;
v_cnt NUMBER := 0;
BEGIN
SELECT AVG(sal) INTO v_avg_sal FROM emp;
FOR emp_rec IN (SELECT * FROM emp WHERE sal < v_avg_sal)
LOOP
UPDATE emp SET sal = sal + 200 WHERE empno = emp_rec.empno;
v_cnt := v_cnt + 1;
END LOOP;
RETURN v_cnt;
END;
```
希望这些代码能够帮到你!
阅读全文