oracle游标的使用

来源:互联网 发布:java服务器路径怎么写 编辑:程序博客网 时间:2024/06/10 19:47

1.游标的定义

游标(Cursor),也称之为光标,从字面意思理解就是游动的光标。

游标是映射在结果集中一行数据上的位置实体。

游标是从表中检索出结果集,并从中每次指向一条记录进行交互的机制。


2. 游标的声明

CURSOR 游标名  [ (参数名  数据类型[,参数名 数据类型]...)]

     IS  SELECT   语句;

【示例】

无参游标:

cursor c_emp is select ename from emp;

有参游标:

cursorc_emp(v_deptno emp.deptno%TYPE) is select ename from emp where deptno=v_deptno;

3.游标的属性

游标的属性

返回值类型

说明

%ROWCOUNT

整型

获得FETCH语句返回的数据行数

%FOUND

布尔型

最近的FETCH语句返回一行数据则为真,否则为假

%NOTFOUND

布尔型

%FOUND属性返回值相反

%ISOPEN

布尔型

游标已经打开时值为真,否则为假


4.游标的使用案列

--使用游标查询emp表中所有员工的姓名和工资,并将其依次打印出来。

DECLARE

  --声明一个游标

  CURSOR C_EMPISSELECT *FROM EMP;

  --记录型变量

  v_emp emp%ROWTYPE;

 

BEGIN

  --打开游标,执行查询

  OPEN C_EMP;

  --使用游标,循环取值

  LOOP 

    --获取游标的值放入变量的时候,必须要into前后要对应(数量和类型)

    FETCH C_EMPINTO v_emp; 

    EXITWHEN C_EMP%NOTFOUND

    --输出打印

    DBMS_OUTPUT.PUT_LINE('员工的姓名:' || v_emp.ename ||',员工的工资' || v_emp.sal); 

  ENDLOOP;

CLOSE c_emp ;--关闭游标,释放资源 

END;

5.SCOTT表使用游标案列,上面有讲解了下面的就不写解释了。


(1)例题:显示30部门的所有员工的编号及姓名,要求格式是  编号--姓名

DECLAREerow  emp%ROWTYPE;CURSOR cur_1 IS SELECT * FROM emp WHERE deptno=30;BEGIN       OPEN cur_1;       LOOP         FETCH cur_1 INTO erow;         EXIT WHEN cur_1%NOTFOUND;         dbms_output.put_line(erow.empno||'-----'||erow.ename);      END LOOP;      CLOSE cur_1;END;
(2)例题:显示30部门的所有员工的编号及姓名,要求格式是  编号--姓名(部门编号手动输入)
DECLAREerow emp%ROWTYPE;CURSOR cur_2 IS SELECT * FROM emp WHERE deptno=&部门编号;BEGIN       OPEN cur_2;       LOOP         FETCH cur_2 INTO erow;         EXIT WHEN cur_2%NOTFOUND;         dbms_output.put_line(erow.empno||'-----------'||erow.ename);       END LOOP;        CLOSE cur_2;END;
(3)例题查询10号部门的员工的姓名和薪资

DECLARECURSOR  c_1 (v_deptno emp.deptno%TYPE) IS SELECT ename,sal FROM emp WHERE deptno=v_deptno;v_ename emp.ename%TYPE;v_sal emp.sal%TYPE;BEGIN  OPEN c_1(10);  LOOP    FETCH c_1 INTO v_ename,v_sal;    EXIT WHEN c_1%NOTFOUND;    dbms_output.put_line(v_ename||'---'||v_sal);   END LOOP;    CLOSE c_1;END;
(4)例题查询10号部门的员工的姓名和薪资(部门手动输入)
DECLARE  CURSOR c_2(v_deptno emp.deptno%TYPE) IS  SELECT ename,sal FROM emp  WHERE deptno = v_deptno;v_ename emp.ename%TYPE;v_sal emp.sal%TYPE;vv_deptno emp.deptno%TYPE;BEGIN  vv_deptno :=&部门编号;  OPEN c_2(vv_deptno);  LOOP    FETCH c_2 INTO v_ename,v_sal;    EXIT WHEN c_2%NOTFOUND;    dbms_output.put_line(v_ename||'--'||v_sal);  END LOOP;  CLOSE c_2;  END;



原创粉丝点击