处理显式游标

来源:互联网 发布:prim和kruskal算法 编辑:程序博客网 时间:2024/05/29 18:51
显式游标处理需四个PL/SQL步骤:
1. 定义/声明游标
   就是定义一个游标名,以及与其相对应的SELECT 语句。
   语法:
   CURSOR cursor_name[(parameter[, parameter]…)] [RETURN datatype]
   IS  select_statement; 

   游标参数只能为输入参数,其语法为: 
   parameter_name [IN] datatype [{:= | DEFAULT} expression]
   在指定数据类型时,不能使用长度约束。如NUMBER(4),CHAR(10) 等都是错误的。
   [RETURN datatype]是可选的,表示游标返回数据的数据。如果选择,则应该严格与select_statement中的选择列表在次序和数据类型上匹配。
   一般是记录数据类型或带“%ROWTYPE”的数据。
 
2. 打开游标
   就是执行游标所对应的SELECT 语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识游标结果集合。
   如果游标查询语句中带有FOR UPDATE选项,OPEN 语句还将锁定数据库表中游标结果集合对应的数据行。
   语法:
   OPEN cursor_name[([parameter =>] value[, [parameter =>] value]…)];
   在向游标传递参数时,可以使用与函数参数相同的传值方法,即位置表示法和名称表示法。
   PL/SQL 程序不能用OPEN 语句重复打开一个游标。


3. 提取游标数据
   就是检索结果集合中的数据行,放入指定的输出变量中。 
   语法:
   FETCH cursor_name INTO {variable_list | record_variable };
   执行FETCH语句时,每次返回一个数据行,然后自动将游标移动指向下一个数据行。
   当检索到最后一行数据时,如果再次执行FETCH语句,将操作失败,并将游标属性%NOTFOUND置为TRUE。所以每次执行完FETCH语句后,检查游标属性%NOTFOUND就可以判断FETCH语句是否执行成功并返回一个数据行,以便确定是否给对应的变量赋了值。


4. 对该记录进行处理;
5. 继续处理,直到活动集合中没有记录;
6. 关闭游标
   当提取和处理完游标结果集合数据后,应及时关闭游标,以释放该游标所占用的系统资源,并使该游标的工作区变成无效,不能再使用FETCH 语句取其中数据。关闭后的游标可以使用OPEN 语句重新打开。
   语法:
   CLOSE cursor_name;
 注:定义的游标不能有INTO 子句。


例一,无参游标
create or replace procedure p_test_cusor_noparam is  CURSOR c_cursor IS    SELECT t.ename, t.sal FROM emp t WHERE rownum < 11;  v_ename emp.ename%TYPE;  v_sal   emp.sal%TYPE;begin  OPEN c_cursor;  FETCH c_cursor    INTO v_ename, v_sal;  WHILE c_cursor%FOUND LOOP    DBMS_OUTPUT.PUT_LINE(v_ename || '---' || to_char(v_sal));    FETCH c_cursor      INTO v_ename, v_sal;  END LOOP;  CLOSE c_cursor;end p_test_cusor_noparam;

例二,有参游标
create or replace procedure p_test_cusor_hasparam is  DeptRec   dept%ROWTYPE;  Dept_name dept.dname%TYPE;  Dept_loc  dept.loc%TYPE;  CURSOR c1 IS    SELECT dname, loc FROM dept WHERE deptno <= 30;  CURSOR c2(dept_no NUMBER DEFAULT 10) IS    SELECT dname, loc FROM dept WHERE deptno <= dept_no;  CURSOR c3(dept_no NUMBER DEFAULT 10) IS    SELECT * FROM dept WHERE deptno <= dept_no;begin  OPEN c1;  LOOP    FETCH c1      INTO dept_name, dept_loc;    EXIT WHEN c1%NOTFOUND;    DBMS_OUTPUT.PUT_LINE(dept_name || '---' || dept_loc);  END LOOP;  CLOSE c1;  OPEN c2;  LOOP    FETCH c2      INTO dept_name, dept_loc;    EXIT WHEN c2%NOTFOUND;    DBMS_OUTPUT.PUT_LINE(dept_name || '---' || dept_loc);  END LOOP;  CLOSE c2;  OPEN c3(dept_no => 20);  LOOP    FETCH c3      INTO deptrec;    EXIT WHEN c3%NOTFOUND;    DBMS_OUTPUT.PUT_LINE(deptrec.deptno || '---' || deptrec.dname || '---' ||                         deptrec.loc);  END LOOP;  CLOSE c3;end p_test_cusor_hasparam;


1 0
原创粉丝点击