美文网首页
PLSQL(二)

PLSQL(二)

作者: 大炮对着虫子 | 来源:发表于2017-09-27 19:14 被阅读6次
游标

Oracle会创建一个存储区域,被称为上下文区域用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等。

游标是指向这一上下文的区域。 PL/SQL通过控制光标在上下文区域。游标持有的行(一个或多个)由SQL语句返回。行集合光标保持的被称为活动集合。

可以命名一个光标,它可以在程序中获取和处理SQL语句,一次返回的行引用

游标属性
游标名%found:当最近一次数据读取成功返回true
游标名%notfound:游标最近一次数据读取失败返回true
游标名%isopen:判断游标是否打开
游标名%rowcount:返回已经读取数据行数

有两种类型的游标:

隐式游标
显式游标

DECLARE
   c_id customers.id%type;
   c_name customers.name%type;
   c_addr customers.address%type;
--一般游标的声明放在变量声明后面
   CURSOR c_customers is
      SELECT id, name, address FROM customers;
BEGIN
if not c_customers%isopen then
   OPEN c_customers;   //打开游标
end if;
   LOOP
      FETCH c_customers into c_id, c_name, c_addr;   //执行游标
      EXIT WHEN c_customers%notfound;
      dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr);
   END LOOP;
   dbms_output.put_line(c_customers%rowcount);  //输出读取的总行数
   CLOSE c_customers;  //关闭游标
END;
参数化游标:

注意:传递的参数不能定义长度
例子1

  declare
   emp1 emp%rowtype;
   cursor emp_cur(p_deptno number) is 
   select *from emp where deptno=p_deptno;
   begin
     open emp_cur(30);  --打开游标
     fetch emp_cur into emp1; --执行游标
     while emp_cur%found loop
       dbms_output.put_line(emp1.empno||emp1.ename);
       fetch emp_cur into emp1;
       end loop;
       close emp_cur;
       end;

例子2

  --1.输出某个部门的员工姓名,工资,入职日期
       declare 
       type emp_record is record(
       v_ename emp.ename%type,
       v_sal emp.sal%type,
       v_date emp.hiredate%type
       );
       emp1 emp_record;
       cursor emp_cur(p_deptno number) is
       select ename,sal,hiredate from emp where deptno=p_deptno;
       begin
          open emp_cur(30);  --打开游标
     fetch emp_cur into emp1; --执行游标
     while emp_cur%found loop
       dbms_output.put_line(emp1.v_ename||emp1.v_sal||emp1.v_date);
       fetch emp_cur into emp1;
       end loop;
       close emp_cur;
         end;
游标for循环
  --游标for循环
         begin
           for e in (select empno,ename,sal from emp)loop
             dbms_output.put_line(e.empno||e.ename||e.sal);
             end loop;
           end;
           --游标带参for循环
           declare
           cursor emp_cur(p_deptno emp.deptno%type) is
           select *from emp where deptno=p_deptno;
           begin
             for e in emp_cur(30) loop
               dbms_output.put_line(e.empno||e.ename||e.sal);
               end loop;
               end;
隐式游标

固定游标名称 :sql
游标4大属性
sql%found:如果操作有影响行数,则返回true
sql%notfound:如果操作没有影响行数,返回true
sql%isopen: 恒为 false
sql%rowcount:操作影响的行数
需要在事务结束前,读取的是最近的一次。

相关文章

网友评论

      本文标题:PLSQL(二)

      本文链接:https://www.haomeiwen.com/subject/tzpyextx.html