⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 光标_parameter_练习.txt

📁 orale培训教材包括了所有的sql说明和实例
💻 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 + -