源码-Oracle数据库管理-第十五章-触发器和游标-Part 2(理解游标)

游标在目前的实际工作中接触也不多,希望以后有机会深入学习一下。

--代码15.18 在PL/SQL中使用隐式游标
BEGIN
   UPDATE emp
      SET comm = comm * 1.12
    WHERE empno = 7369;                  --更新员工编号为7369的员工信息       
   --使用隐式游标属性判断已更新的行数
   DBMS_OUTPUT.put_line (SQL%ROWCOUNT || ' 行被更新');
   --如果没有任何更新
   IF SQL%NOTFOUND
   THEN
      --显示未更新的信息
      DBMS_OUTPUT.put_line ('不能更新员工号为7369的员工!');
   END IF;
   --向数据库提交更改
   COMMIT;
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line (SQLERRM);  --如果出现异常,显示异常信息
END;


--代码15.19 定义显示游标
DECLARE
   CURSOR emp_simple_cursor              --简单游标定义,查询部门编号为20的数据
   IS
      SELECT *
        FROM emp
       WHERE deptno = 20;
   --声明游标并指定游标返回值类型
   CURSOR emp_cursor (p_deptno IN NUMBER) RETURN emp%ROWTYPE
   IS
      SELECT *
        FROM emp
       WHERE deptno = p_deptno;  
BEGIN
   OPEN emp_cursor (20);   --打开游标
END;


--代码15.20 声明并定义游标示例
DECLARE
  CURSOR c1_dept RETURN dept%ROWTYPE;      --声明一个游标
  CURSOR c2_emp IS                           --定义且声明一个游标
    SELECT empno,ename,sal,comm FROM emp
    WHERE deptno=20; 
  CURSOR c1_dept RETURN dept%ROWTYPE IS  --定义游标c1_dept
    SELECT * FROM dept              -- 指定游标的SELECT语句和返回类型
    WHERE deptno = 20;
  CURSOR c3_emp RETURN emp%ROWTYPE;      --声明游标c3_emp
  CURSOR c3_emp IS                       -- 定义一个游标c3_emp
    SELECT * FROM emp                -- 这里可以省略掉返回类型
    WHERE empno = '7369';
BEGIN
  NULL;
END;
/


--代码15.21 使用Fetch语句提取游标数据
DECLARE
  deptno dept.deptno%TYPE;                     --定义保存游标数据的变量
  dname dept.dname%TYPE;
  loc dept.loc%TYPE;
  dept_row dept%ROWTYPE;                     --定义记录变量
  CURSOR dept_cur IS SELECT * FROM dept;     --定义游标
BEGIN
   OPEN dept_cur ;                              --打开游标
   LOOP      
      IF dept_cur%ROWCOUNT<=4 THEN         --判断如果当前提取的游标小于等于4行
        FETCH dept_cur  INTO dept_row;         --提取游标数据到记录类型中
        IF dept_cur%FOUND THEN               --如果FETCH到数据,则进行显示
        DBMS_OUTPUT.PUT_LINE(dept_row.deptno||' '||dept_row.dname||' '||dept_row.loc);
        END IF;
      ELSE
        FETCH dept_cur INTO deptno,dname,loc;   --否则提取记录到变量列表中
        IF dept_cur%FOUND THEN               --如果提取到数据则进行显示
        DBMS_OUTPUT.PUT_LINE(deptno||' '||dname||' '||loc);
        END IF;        
      END IF;
      EXIT WHEN dept_cur%NOTFOUND;        --判断是否提取完成
   END LOOP;
   CLOSE dept_cur;
END;


--代码15.22 使用bulk collect into批量提取游标数据
DECLARE
  --定义2个嵌套表类型,分别用来保存员工的编号和员工名称
  TYPE IdsTab  IS TABLE OF emp.empno%TYPE;
  TYPE NameTab IS TABLE OF emp.ename%TYPE;
  --定义2个嵌套表变量,游标数据将被提取到嵌套表变量中
  ids    IdsTab;
  names  NameTab;
  --定义一个游标,用来从emp表中提取员工编号和员工姓名
  CURSOR c1 IS
    SELECT empno, ename
    FROM emp
    WHERE job = '职员';
BEGIN
  --打开游标
  OPEN c1;   
  --使用BULK COLLECT INTO子句批量提取游标数据
  FETCH c1 BULK COLLECT INTO ids, names;
  CLOSE c1;
  --使用集合API循环提取嵌套表中的数据
  FOR i IN ids.FIRST .. ids.LAST
    LOOP
      --输出嵌套表中的员工编号
      IF ids(i) > 7900 THEN
        DBMS_OUTPUT.PUT_LINE( ids(i) );
      END IF;
    END LOOP;
  --使用集合API循环提取嵌套表中的员工姓名数据
  FOR i IN names.FIRST .. names.LAST
    LOOP
      --输出嵌套表中姓李的员工数据
      IF names(i) LIKE '李%' THEN
        DBMS_OUTPUT.PUT_LINE( names(i) );
      END IF;
    END LOOP;
END;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值