Oracle 游标使用全解

这个<Oracle 游标使用全解>文档几乎包含了Oracle游标使用的方方面面,全部通过了测试

-- 声明游标;CURSOR cursor_name IS select_statement

--For 循环游标
--(1)定义游标
--(2)定义游标变量
--(3)使用for循环来使用这个游标
declare
      --类型定义
      cursor c_job
      is
      select empno,ename,job,sal
      from emp
      where job='MANAGER';
      --定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp中的一行数据类型
      c_row c_job%rowtype;
begin
      for c_row in c_job loop
        dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
      end loop;
end;


     
--Fetch游标
--使用的时候必须要明确的打开和关闭

declare
      --类型定义
      cursor c_job
      is
      select empno,ename,job,sal
      from emp
      where job='MANAGER';
      --定义一个游标变量
      c_row c_job%rowtype;
begin
      open c_job;
        loop
          --提取一行数据到c_row
          fetch c_job into c_row;
          --判读是否提取到值,没取到值就退出
          --取到值c_job%notfound 是false
          --取不到值c_job%notfound 是true
          exit when c_job%notfound;
            dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
        end loop;
      --关闭游标
      close c_job;
end;

--1:任意执行一个update操作,用隐式游标sql的属性%found,%notfound,%rowcount,%isopen观察update语句的执行情况。
      begin
        update emp set ENAME='ALEARK' WHERE EMPNO=7469;
        if sql%isopen then
          dbms_output.put_line('Openging');
          else
            dbms_output.put_line('closing');
            end if;
          if sql%found then
            dbms_output.put_line('游标指向了有效行');--判断游标是否指向有效行
            else
              dbms_output.put_line('Sorry');
              end if;
              if sql%notfound then
                dbms_output.put_line('Also Sorry');
                else
                  dbms_output.put_line('Haha');
                  end if;
                  dbms_output.put_line(sql%rowcount);
                  exception
                    when no_data_found then
                      dbms_output.put_line('Sorry No data');
                      when too_many_rows then
                        dbms_output.put_line('Too Many rows');
                        end;
declare
      empNumber emp.EMPNO%TYPE;
      empName emp.ENAME%TYPE;
      begin
        if sql%isopen then
          dbms_output.put_line('Cursor is opinging');
          else
            dbms_output.put_line('Cursor is Close');
            end if;
            if sql%notfound then
              dbms_output.put_line('No Value');
              else
                dbms_output.put_line(empNumber);
                end if;
                dbms_output.put_line(sql%rowcount);
                dbms_output.put_line('-------------');
               
                select EMPNO,ENAME into  empNumber,empName from emp where EMPNO=7499;
                dbms_output.put_line(sql%rowcount);
               
                if sql%isopen then
                dbms_output.put_line('Cursor is opinging');
                else
                dbms_output.put_line('Cursor is Closing');
                end if;
                if sql%notfound then
                dbms_output.put_line('No Value');
                else
                dbms_output.put_line(empNumber);
                end if;
                exception
                  when no_data_found then
                    dbms_output.put_line('No Value');
                    when too_many_rows then
                      dbms_output.put_line('too many rows');
                      end;
                 
               
     
--2,使用游标和loop循环来显示所有部门的名称
--游标声明
declare
      cursor csr_dept
      is
      --select语句
      select DNAME
      from Depth;
      --指定行指针,这句话应该是指定和csr_dept行类型相同的变量
      row_dept csr_dept%rowtype;
begin
      --for循环
      for row_dept in csr_dept loop
          dbms_output.put_line('部门名称:'||row_dept.DNAME);
      end loop;
end;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/2f48cf6a50b04c1130e10f23d5f34489.html