📄 光标_parameter_练习.txt
字号:
scott中的oracle样本库雇员表:具体见cursor_parameter.ppt
SQL> desc emp;scott中的oracle样本库雇员表
名称
--------------------
EMPNO 雇员编号
ENAME 雇员名称
JOB 雇员工作
MGR
HIREDATE
SAL 雇员销售
COMM 雇员提成
DEPTNO 雇员所属部门编号
SQL> desc dept
名称 : scott中的oracle样本库部门表
--------------------------
DEPTNO 部门编号
DNAME 部门名称
LOC 部门地址
要求:用光标统计出各部门的销售总额。
--cursor with parameter---------------------------------------
SET SERVEROUTPUT ON
--计算各输出该部门的总销售额
DECLARE
CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno;
--用于从dept表选择部门编号的游标
CURSOR c_emp (p_dept VARCHAR2) IS
SELECT ename,SAL
FROM emp
WHERE deptno =p_dept
ORDER BY ename;
--用于从empt表选择对应部门的雇员信息的游标.p_dept使用于where子句中,限定部门编号
r_dept DEPT%ROWTYPE;
v_ename EMP.ENAME%TYPE;
v_SAL EMP.SAL%TYPE;
v_tot_sal NUMBER (10,2);
BEGIN
OPEN c_dept;
LOOP
FETCH c_dept INTO r_dept;
EXIT WHEN c_dept%NOTFOUND;
--当游标中没有数据时跳出loop
DBMS_OUTPUT.PUT_LINE ('Department :' || r_dept.deptno|| '-'|| r_dept.dname);
--输出部门编号,名称
v_tot_sal :=0;
OPEN c_emp (r_dept.deptno);
--以deptno打开人员信息表对应的光标。
LOOP
FETCH c_emp INTO v_ename,v_sal;
EXIT WHEN c_emp%NOTFOUND;
--当游标中没有数据时跳出内层loop
DBMS_OUTPUT.PUT_LINE (' 成员: '||v_ename ||'salary:'||v_SAL);
v_tot_sal :=v_tot_sal +v_SAL;
--计算部门的总销售额
END LOOP;
CLOSE c_emp;
DBMS_OUTPUT.PUT_LINE ('Total salary for Dept:'||v_tot_SAL);
--输出该部门的总销售额
END LOOP;
CLOSE c_dept;
END;
--------------------------------------------------------------------
SET SERVEROUTPUT ON
DECLARE
CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno;
--用于选择部门编号的游标
CURSOR c_emp (p_dept VARCHAR2 default 10) IS
SELECT ename,SAL
FROM emp
WHERE deptno =p_dept
ORDER BY ename;
--用于处理同一部门编号的雇员信息的游标
r_dept DEPT%ROWTYPE;
v_ename EMP.ENAME%TYPE;
v_SAL EMP.SAL%TYPE;
v_tot_sal NUMBER (10,2);
BEGIN
OPEN c_dept;
LOOP
FETCH c_dept INTO r_dept;
EXIT WHEN c_dept%NOTFOUND;--当部门光标已没有纪录,退出外层循环
DBMS_OUTPUT.PUT_LINE ('Department :' || r_dept.deptno
|| '-'
|| r_dept.dname);
v_tot_sal :=0;
OPEN c_emp (r_dept.deptno);
LOOP
FETCH c_emp INTO v_ename,v_sal;
EXIT WHEN c_emp%NOTFOUND;--当雇员光标已没有纪录,退出内层循环
DBMS_OUTPUT.PUT_LINE ('Name:'||v_ename ||'
salary:'
||v_SAL);
v_tot_sal :=v_tot_sal +v_SAL;
END LOOP;
CLOSE c_emp;
DBMS_OUTPUT.PUT_LINE ('Total salary for Dept:'||v_tot_SAL);
END LOOP;
CLOSE c_dept;
END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -