小弟在PRO*C的官方文档中看到,如果在PL/SQL中使用游标的话就不需要使用DECLARE,OPEN,FETCH,CLOSE这些语句,而是使用一个游标FOR循环,例如:DECLARE
...
BEGIN
FOR emprec IN (SELECT empno, sal, comm FROM emp) LOOP
IF emprec.comm / emprec.sal > 0.25 THEN ...
...
END LOOP;
END;
(例中的‘.'表示引用记录中的字段)
小弟对这样的游标操作感觉很诧异,哪位老大能给讲解一下呢?

解决方案 »

  1.   


    游标 cursor:查询返回的结果集  1、静态游标,与定义好的查询关联;   a、显式游标
          type t_type is record(                      --    定义保存结果的类型
                           pk     t.pk%type
                          ,name1  t.name1%type
                          ,name2  t.name2%type
                          );
          v_t t_type;                                 --    定义结果变量,行记录。当然也可以不这样定义,而一个个指定字段变量。
      
          cursor c for select * from t where pk=1;    --    静态游标:1、定义游标
          open c;                                     --    静态游标:2、打开游标
          fetch c into v_t;                           --    
          while c%FOUND loop                          --    静态游标:3、遍历游标   
              fetch c into v_t;
              [ some DML ... with v_t.pk,v_t.name1,v_t.name2 ... ]
          end loop;
          close c;                                    --    静态游标:4、关闭游标  
          
          
       b、隐式游标
          for x in (select * from t where pk=t) loop  --    隐式游标,相对于显示游标,结构简单,推荐使用
              [ some DML ...with x.pk,x.name1,x.name2 ... ]
          end loop;
    2、动态游标:ref cursor 查询语句可以动态指定   a、弱类型游标
          type refcur_t is ref cursor;                                  --   弱游标类型定义不指定具体的返回类型      refcur  refcur_t;                                             --   弱游标变量
          ----  使用方式同显示静态游标: 
          open refcur for select ... ;                                  --   关联查询(可以多次关联不同的查询)
          fetch refcur into ... 
          while refcur%FOUND loop
              ...
          end loop;
          close refcur;
          ----   b、强类型游标
          type emp_refcur_t is ref cursor return employees%rowtype;     --   指定返回类型       使用方式同上