Oracle游标使用方法及语法大全 下载本文

6. v_dname varchar2(15);

7. v_manager varchar2(15); 8. CURSOR list_cursor IS

9. SELECT deptno,count(*),sum(sal) FROM emp group by deptno; 10. BEGIN

11. OPEN list_cursor;

12. DBMS_OUTPUT.PUT_LINE('----------- 部 门 统 计 表 -----------'); 13. DBMS_OUTPUT.PUT_LINE('部门名称 总人数 总工资 部门经理'); 14. FETCH list_cursor INTO v_deptno,v_count,v_sumsal; 15. WHILE list_cursor%found LOOP 16. SELECT dname INTO v_dname FROM dept 17. WHERE deptno=v_deptno;

18. SELECT ename INTO v_manager FROM emp 19. WHERE deptno=v_deptno and job='MANAGER';

20. DBMS_OUTPUT.PUT_LINE(rpad(v_dname,13)||rpad(to_char(v_count),8) 21. ||rpad(to_char(v_sumsal),9)||v_manager);

22. FETCH list_cursor INTO v_deptno,v_count,v_sumsal; 23. END LOOP;

24. DBMS_OUTPUT.PUT_LINE('--------------------------------------');

25. CLOSE list_cursor; 26. END;

输出结果为: Sql代码

1. -------------------- 部 门 统 计 表 ----------------- 2. 部门名称 总人数 总工资 部门经理 3. ACCOUNTING 3 8750 CLARK 4. 5. 6. 7.

RESEARCH 5 10875 JONES

SALES 6 9400 BLAKE

------------------------------------------------------------- PL/SQL 过程已成功完成。

说明:游标中使用到了起分组功能的SELECT语句,统计出各部门的总人数和总工资。再根据部门编号和职务找到部门的经理。该程序假定每个部门有一个经理。

【训练5】 为雇员增加工资,从工资低的雇员开始,为每个人增加原工资的10%,限定所增加的工资总额为800元,显示增加工资的人数和余额。 输入并调试以下程序: Sql代码

1. SET SERVEROUTPUT ON 2. DECLARE

3. V_NAME CHAR(10); 4. 5. 6. 7.

V_EMPNO NUMBER(5); V_SAL NUMBER(8); V_SAL1 NUMBER(8);

V_TOTAL NUMBER(8) := 800; --增加工资的总额

8. V_NUM NUMBER(5):=0; --增加工资的人数 9. CURSOR emp_cursor IS

10. SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL ASC; 11. BEGIN

12. OPEN emp_cursor;

13. DBMS_OUTPUT.PUT_LINE('姓名 原工资 新工资'); 14. DBMS_OUTPUT.PUT_LINE('---------------------------'); 15. LOOP

16. FETCH emp_cursor INTO V_EMPNO,V_NAME,V_SAL; 17. EXIT WHEN emp_cursor%NOTFOUND; 18. V_SAL1:= V_SAL*0.1;

19. IF V_TOTAL>V_SAL1 THEN

20. V_TOTAL := V_TOTAL - V_SAL1; 21. V_NUM:=V_NUM+1;

22. DBMS_OUTPUT.PUT_LINE(V_NAME||TO_CHAR(V_SAL,'99999')|| 23. TO_CHAR(V_SAL+V_SAL1,'99999'));

24. UPDATE EMP SET SAL=SAL+V_SAL1 25. WHERE EMPNO=V_EMPNO; 26. ELSE

27. DBMS_OUTPUT.PUT_LINE(V_NAME||TO_CHAR(V_SAL,'99999')||TO_CHAR(V_SAL,'99999'));

28. END IF;

29. END LOOP;

30. DBMS_OUTPUT.PUT_LINE('---------------------------'); 31. DBMS_OUTPUT.PUT_LINE('增加工资人数:'||V_NUM||' 剩余工资:'||V_TOTAL);

32. CLOSE emp_cursor; 33. COMMIT; 34. END;

输出结果为: Sql代码

1. 姓名 原工资 新工资

2. --------------------------------------------- 3. SMITH 1289 1418 4. JAMES 1531 1684 5. MARTIN 1664 1830

6. MILLER 1730 1903

7. ALLEN 1760 1936 8. ADAMS 1771 1771 9. TURNER 1815 1815 10. WARD 1830 1830 11. BLAKE 2850 2850 12. CLARK 2850 2850

13. JONES 2975 2975 14. FORD 3000 3000 15. KING 5000 5000

16. ----------------------------------------------- 17. 增加工资人数:5 剩余工资:3 18. PL/SQL 过程已成功完成。

【练习1】按部门编号从小到大的顺序输出雇员名字、工资以及工资与平均工资的差。 【练习2】为所有雇员增加工资,工资在1000以内的增加30%,工资在1000~2000之间的增加20%,2000以上的增加10%。

======================================================

oracle动态游标实例

1,带参数的游标

与存储过程和函数相似,可以将参数传递给游标并在查询中使用。这对于处理在某种条件下打开游标的情况非常有用。它的语法如下:

CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement; 定义参数的语法如下:

Parameter_name [IN] data_type[{:=|DEFAULT} value]

与存储过程不同的是,游标只能接受传递的值,而不能返回值。参数只定义数据类型,没有大小。

另外可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。 在打开游标时给参数赋值,语法如下:

OPEN cursor_name[value[,value]....]; 参数值可以是文字或变量。 例: DECALRE

CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno; CURSOR c_emp (p_dept VARACHAR2) IS SELECT ename,salary FROM emp

WHERE deptno=p_dept ORDER BY ename

r_dept DEPT%ROWTYPE; v_ename EMP.ENAME%TYPE; v_salary EMP.SALARY%TYPE; v_tot_salary EMP.SALARY%TYPE; 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_salary:=0;

OPEN c_emp(r_dept.deptno);

LOOP

FETCH c_emp INTO v_ename,v_salary; EXIT WHEN c_emp%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary); v_tot_salary:=v_tot_salary+v_salary;

END LOOP; CLOSE c_emp;

DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary); END LOOP; CLOSE c_dept; END;

2. 字符串变量

动态游标就是动态定义游标。 declare

type t_sor is ref cursor;

v_sor t_sor; --必需的,通过对象变量实现. ... begin .. end; /

给一个完整的例子:

create or replace procedure SP_CLEAR(V_TABLE IN STRING) IS