/*

    游标:可以用来存放查询结果,逐行提取查询结果,以编程的方式访问数据

    类型:1.隐式游标;2.显示游标;3.引用游标

*/

/*

PL/SQL中使用DML语句时自动创建隐式游标

隐式游标自动声明、打开和关闭,其名为 SQL

通过检查隐式游标的属性可以获得最近执行的DML 语句的信息

隐式游标的属性有:

1.%FOUND – SQL 语句影响了一行或多行时为 TRUE

2.%NOTFOUND – SQL 语句没有影响任何行时为TRUE

3.%ROWCOUNT – SQL 语句影响的行数

4.%ISOPEN  - 游标是否打开,始终为FALSE

*/

create or replace procedure sopV(obj varchar2)

as        -- 定义一个存储过程,用于输出字符串,简化书写

begin

  dbms_output.put_line(obj);

end;

create or replace procedure sopN(obj number)

as        -- 定义一个存储过程,用于输出number类型

begin

  dbms_output.put_line(obj);

end;

-- 隐式游标1

declare

  v_ename emp.ename%type;

  v_sql varchar2(200);

  v_no number := '&编号:';

begin

  v_sql := 'select * from emp where empno =: no';

  execute immediate v_sql using v_no;

  if sql%notfound then-- 如果没有影响函数,notfound

    sopV('没有找到!');

  elsif sql%found then

    sopN(sql%rowcount);

  end if;

end;

--隐式游标2

declare

  v_name varchar2(20) := 'ysjian';

begin

  update emp set ename = v_name where empno = 7369;

  if sql%found then

    sopV('更新成功');

    sopN(sql%rowcount);

  elsif sql%notfound then

     sopV('没有找到!');

  end if;

end;

--隐式游标3

declare

     v_emp_rec emp%rowtype;

     v_empno number := '&empno';

begin

     select * into v_emp_rec from emp where empno=v_empno;

     if sql%notfound

        then dbms_output.put_line('没有找到');

     else

        dbms_output.put_line(v_emp_rec.empno||'-->'||v_emp_rec.ename);

     end if;

     exception

       when no_data_found -- 异常类型,没有找到数据时

         then dbms_output.put_line('data no found exception!');

end;

 

--显示游标1,关键字,cursor is opoen fetch close

declare

  v_emp emp%rowtype;

  cursor v_cur  is -- 此处与一般的变量声明不同,类型发在名称前面,关键字不能用as,用is

        select * from emp;

begin

  open v_cur; --打开游标

  loop

    fetch v_cur into v_emp; --提取游标

    sopV(v_emp.ename);

    exit when v_cur%notfound;

  end loop;

  close v_cur; -- 关闭游标

end;

 

-- 显示游标2for循环遍历,打开,提取和关闭游标的操作自动完成

declare

 v_emp emp%rowtype;

 cursor v_cur is select * from emp;

begin

  for res in v_cur

    loop

      sopV(res.ename);

    end loop;

end

--显示游标3,带参数

declare

    v_emp emp%rowtype;

    cursor v_cur(parameter varchar2) is select * from emp where ename = parameter;

begin

  for v_res in v_cur('&ename')

      loop

        sopV(v_res.ename);

      end loop;

end;