美文网首页
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