/*
编写一个 PL/SQL 块,它使用游标遍历 emp 表,计算部门编号为 30 的所有员工工资的总和。
程序需要使用:
游标 来获取部门编号为 30 的员工。
记录类型 来存储每条记录的数据。
循环 来逐行处理游标结果。
游标的属性(例如 %ROWCOUNT、%FOUND、%NOTFOUND)来控制循环和输出信息。
要求:
声明一个游标,选择 deptno = 30 的所有员工的 empno、ename 和 sal。
定义一个记录类型,用来存储每次提取的员工记录。
使用 FOR 或 WHILE 循环 遍历游标并计算工资总和。
在循环结束后,输出 部门 30 的工资总和以及部门内的员工数量(使用 %ROWCOUNT 属性)。
确保使用游标的属性 来控制退出条件(使用 %NOTFOUND 或 %FOUND)。
*/
基础代码
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
CREATE TABLE emp (
empno NUMBER(5) NOT NULL,
ename VARCHAR2(20) NOT NULL,
job VARCHAR2(9) NOT NULL,
mgr NUMBER(5),
hiredate DATE NOT NULL,
sal NUMBER(7,2) NOT NULL,
comm NUMBER(7,2),
deptno NUMBER(5) NOT NULL
)TABLESPACE my_tablespace;
INSERT INTO emp VALUES (7369, 'SMITH', 'CLERK', 7902, '1990-12-17', 800.00, NULL, 20);
INSERT INTO emp VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1991-02-20', 1600.00, 300.00, 30);
INSERT INTO emp VALUES (7521, 'WARD', 'SALESMAN', 7698, '1991-02-22', 1250.00, 500.00, 30);
INSERT INTO emp VALUES (7566, 'JONES', 'MANAGER', 7839, '1991-04-02', 2975.00, NULL, 20);
INSERT INTO emp VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1991-09-28', 1250.00, 1400.00, 30);
INSERT INTO emp VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1991-05-01', 2850.00, NULL, 30);
INSERT INTO emp VALUES (7782, 'CLARK', 'MANAGER', 7839, '1991-06-09', 2450.00, NULL, 10);
INSERT INTO emp VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1997-04-19', 3000.00, NULL, 20);
INSERT INTO emp VALUES (7839, 'KING', 'PRESIDENT', NULL, '1991-11-17', 5000.00, NULL, 10);
INSERT INTO emp VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1991-09-08', 1500.00, NULL, 30);
INSERT INTO emp VALUES (7900, 'JAMES', 'CLERK', 7698, '1991-12-03', 950.00, NULL, 30);
INSERT INTO emp VALUES (7902, 'FORD', 'ANALYST', 7566, '1991-12-03', 3000.00, NULL, 20);
INSERT INTO emp VALUES (7934, 'MILLER', 'CLERK', 7782, '1992-01-23', 1300.00, NULL, 10);
COMMIT;
SELECT * FROM emp;
结果代码
declare
v_total_sal number:=0;
v_total_count number:=0;
cursor emp_cursor is select empno,ename,sal from emp where deptno=30;
v_emp_record emp_cursor%rowtype;
begin
open emp_cursor;
fetch emp_cursor into v_emp_record;
while emp_cursor%found loop
v_total_sal :=v_total_sal+v_emp_record.sal;
v_total_count:=v_total_count+1;
dbms_output.put_line('员工编号:'||v_emp_record.empno||
',员工姓名:'||v_emp_record.ename||',工资:' ||v_emp_record.sal);
fetch emp_cursor into v_emp_record;
end loop;
close emp_cursor;
dbms_output.put_line('部门 30 的员工数量: ' || v_total_count);
dbms_output.put_line('部门 30 的工资总和: ' || v_total_sal);
end;