oracle中的游标

来源:互联网 发布:python lambda 包含for 编辑:程序博客网 时间:2024/06/05 00:43

BEGIN

  UPDATE emp

  SET sal = sal +500

  WHERE sal <1500;

 

  IFSQL%FOUNDTHEN

    dbms_output.put_line('更新成功,更新了' || SQL%ROWCOUNT);

    COMMIT;   --执行完毕提交数据

  ELSE

    dbms_output.put_line('更新失败');

  ENDIF;

END;

 

SELECT *FROM empWHERE sal <1500;

 

SELECT *FROM emp;

 

-----------------------------------------------------------------

--存储过程 

--查询指定部门的员工信息

DECLARE

   --游标的声明

   CURSOR empinfo_curIS

   SELECT empno,ename,sal

     FROM emp

    WHERE deptno =10;

   

    --定义以下变量分别保存游标中提取的数据

    v_empno emp.empno%TYPE;

    v_ename emp.ename%TYPE;

    v_sal emp.sal%TYPE;

   

BEGIN

  --2.打开游标,只能打开一次,不能重复打开

  OPEN empinfo_cur;

 

  --3.提取游标中的数据

 

  FETCH empinfo_curINTO v_empno,v_ename,v_sal;

 

      EXITWHEN (empinfo_cur%NOTFOUND);

  --输出游标中的数据

  dbms_output.put_line('员工工号:' || v_empno ||

                      ',员工姓名:' || v_ename ||

                       ',员工工资:' || v_sal);

 

  --4.关闭游标

  CLOSE empinfo_cur;

 

END;

 

--------------------------------------------------------------------

--使用loop-exit-end循环结构实现

--查询指定部门的员工信息

DECLARE

   --游标的声明

   CURSOR empinfo_curIS

   SELECT empno,ename,sal

     FROM emp

    WHERE deptno =10;

   

    --定义以下变量分别保存游标中提取的数据

    v_empno emp.empno%TYPE;

    v_ename emp.ename%TYPE;

    v_sal emp.sal%TYPE;

   

BEGIN

  --2.打开游标,只能打开一次,不能重复打开

  OPEN empinfo_cur;

 

  --3.提取游标中的数据

 

 LOOP

       --fetch语句执行过程:先向下移动游标,再从游标中提取数据

      FETCH empinfo_curINTO v_empno,v_ename,v_sal;

      --当提取到最后一行,没有数据时,%NOTFOUND返回为true

      EXITWHEN (empinfo_cur%NOTFOUND);

  --输出游标中的数据

  dbms_output.put_line('员工工号:' || v_empno ||

                      ',员工姓名:' || v_ename ||

                       ',员工工资:' || v_sal);

  ENDLOOP;

 

  --4.关闭游标

  CLOSE empinfo_cur;

 

END;

 

-------------------------------------------------------------

--使用while-loop-end循环结构实现

--查询指定部门的员工信息

DECLARE

   --1.游标的声明,带参数的游标

   CURSOR empinfo_cur(v_deptnoNUMBER)IS--number后不能带参数

   SELECT empno,ename,sal

     FROM emp

    WHERE deptno =10;

   

    --定义以下变量分别保存游标中提取的数据

    v_empno emp.empno%TYPE;

    v_ename emp.ename%TYPE;

    v_sal emp.sal%TYPE;

   

BEGIN

  --2.打开游标,只能打开一次,不能重复打开

  OPEN empinfo_cur(&deptno);--带参数的游标

 

  --3.提取游标中的数据

 --先执行fetch操作

 FETCH empinfo_curINTO v_empno,v_ename,v_sal;

  WHILE empinfo_cur%FOUNDLOOP

 

    

  --输出游标中的数据

  dbms_output.put_line('员工工号:' || v_empno ||

                      ',员工姓名:' || v_ename ||

                       ',员工工资:' || v_sal);

  dbms_output.put_line('当前提取了' || empinfo_cur%ROWCOUNT ||'');

 

  --继续执行fetch操作

  FETCH empinfo_curINTO v_empno,v_ename,v_sal;

 

  ENDLOOP;

  --4.关闭游标

  CLOSE empinfo_cur;

 

END;

 

----------------------------------------------------

--for-in循环游标

DECLARE

    CURSOR empinfo_cur(v_deptnoNUMBER)

    IS

    SELECT empno,ename,sal

    FROM emp

    WHERE deptno = v_deptno;

   

BEGIN

  --for循环游标:自动打开,自动提取,自动关闭

  --emp_rec是一个记录类型的变量,也是自动定义,不需要重新定义

  --每一次循环从游标empinfo_cur中取数据,将其保存在记录类型变量emp_rec

  FOR emp_recIN empinfo_cur(&deptno)LOOP

    dbms_output.put_line('员工工号:' || emp_rec.empno ||

                        ',员工姓名:' || emp_rec.ename ||

                        ',员工工资:' || emp_rec.sal);

  ENDLOOP;

END;

 

--------------------------------------------------------------

--ref 引用游标

DECLARE

    --声明一个REF游标类型

    TYPE emp_reftypeISREFCURSOR;

   

    --声明一个emp_reftype类型的游标变量

    empinfo_cur emp_reftype;

   

    --声明变量保存游标查询的数据

    v_empno emp.empno%TYPE;

    v_ename emp.ename%TYPE;

    v_sal emp.sal%TYPE;

   

BEGIN

  IF &sal >2000THEN

    --打开游标并传入sql语句

    OPEN empinfo_cur

    FOR

    SELECT empno,ename,sal

    FROM emp

    WHERE sal >2000;

  ELSE

    OPEN empinfo_cur

    FOR

      SELECT empno,ename,sal

      FROM emp

      WHERE sal <=2000;

 

  ENDIF;

 

  --提取数据(此处不能使用for循环)

  LOOP

    FETCH empinfo_curINTO v_empno,v_ename,v_sal;

    EXITWHEN (empinfo_cur%NOTFOUND);

    dbms_output.put_line('员工工号:' || v_empno ||

                        ',员工姓名:' || v_ename ||

                        ',员工工资:' || v_sal);

  ENDLOOP;

END;