CREATEOR REPLACE PROCEDURE pro_avg_sal_by_job AS CURSOR cur ISSELECT job, AVG(sal) AS avg_sal FROM emp GROUPBY job; BEGIN FOR i IN cur LOOP DBMS_OUTPUT.PUT_LINE(i.job ||' --- '|| i.avg_sal); END LOOP; END; /
3. 编写一个存储过程,根据输入的工作类型,输出该工作的平均工资。
1 2 3 4 5 6 7 8 9 10 11 12 13
CREATEOR REPLACE PROCEDURE pro_avg_sal_by_job(p_job VARCHAR2) AS v_avg_sal NUMBER; BEGIN SELECTAVG(sal) INTO v_avg_sal FROM emp WHERE job = p_job GROUPBY job; DBMS_OUTPUT.PUT_LINE(p_job ||' --- '|| v_avg_sal); END; /
-- 调用存储过程 BEGIN pro_avg_sal_by_job('MANAGER'); END; /
CREATEOR REPLACE FUNCTION fun_get_emp_name(p_empno NUMBER) RETURN VARCHAR2 AS v_ename VARCHAR2(10); BEGIN SELECT ename INTO v_ename FROM emp WHERE empno = p_empno; RETURN v_ename; END; /
CREATEOR REPLACE PROCEDURE pro_increase_sal AS CURSOR cur ISSELECT empno FROM emp WHERE sal <1200; v_count NUMBER :=0; BEGIN FOR i IN cur LOOP UPDATE emp SET sal = sal +300WHERE empno = i.empno; DBMS_OUTPUT.PUT_LINE('员工编号: '|| i.empno ||' 已加薪'); v_count := v_count +1; END LOOP; DBMS_OUTPUT.PUT_LINE('共给 '|| v_count ||' 名员工加薪'); COMMIT; END; /
7. 从 emp 表中查询某部门的员工情况(输入部门编号),将其工资最低定为 1500。
1 2 3 4 5 6
CREATEOR REPLACE PROCEDURE pro_set_min_sal(p_deptno NUMBER) AS BEGIN UPDATE emp SET sal =1500WHERE sal <1500AND deptno = p_deptno; COMMIT; END; /
8. 建立本地过程,用于计算指定部门的工资总和,并统计其中的职工数量(打印)。
1 2 3 4 5 6 7 8 9
CREATEOR REPLACE PROCEDURE pro_dept_sal_sum(p_deptno NUMBER) AS v_total_sal NUMBER; v_emp_count NUMBER; BEGIN SELECTSUM(sal), COUNT(empno) INTO v_total_sal, v_emp_count FROM emp WHERE deptno = p_deptno; DBMS_OUTPUT.PUT_LINE('部门编号: '|| p_deptno ||' 工资总和: '|| v_total_sal ||' 员工数量: '|| v_emp_count); END; /
CREATEOR REPLACE PROCEDURE pro_emp_by_sal_range(p_min_sal NUMBER, p_max_sal NUMBER) AS CURSOR cur ISSELECT empno, ename, sal FROM emp WHERE sal BETWEEN p_min_sal AND p_max_sal ORDERBY sal; BEGIN FOR i IN cur LOOP DBMS_OUTPUT.PUT_LINE('工号: '|| i.empno ||' 姓名: '|| i.ename ||' 薪水: '|| i.sal); END LOOP; END; /
-- 创建备份表 CREATETABLE bak ( bgdate DATE, old_comm NUMBER, new_comm NUMBER, empno NUMBER, name VARCHAR2(10) );
-- 创建存储过程 CREATEOR REPLACE PROCEDURE pro_update_comm AS BEGIN -- 更新奖金 UPDATE emp SET comm = comm *1.1WHERE comm >0AND deptno IN (10, 30); UPDATE emp SET comm = sal *0.4+ NVL(comm, 0) WHERE (comm ISNULLOR comm =0) AND deptno IN (10, 30); COMMIT; END; /
-- 创建触发器 CREATEOR REPLACE TRIGGER tri_comm_change AFTER UPDATEON emp FOREACHROW BEGIN IF :OLD.comm != :NEW.comm THEN INSERTINTO bak VALUES (SYSDATE, :OLD.comm, :NEW.comm, :OLD.empno, :OLD.ename); END IF; END; /
CREATEOR REPLACE FUNCTION fun_update_sal RETURN NUMBER AS v_count NUMBER :=0; BEGIN -- 更新薪水 UPDATE emp SET sal = sal *1.05WHERE sal <5000AND ename LIKE'孙%'; v_count :=SQL%ROWCOUNT; -- 获取受影响的行数
-- 判断是否更新成功 IF v_count >0THEN RETURN0; -- 更新成功 ELSE RETURN1; -- 更新失败 END IF; END; /