关闭游标

create or replace PROCEDURE PROC_STU3 AS 
BEGIN 
--显示游标使用,使用for循环 
declare 
--定义游标,名称为cur_stu 
cursor cur_stu is 
select stuno,stuname from student order by stuno; 
begin 
for stu in cur_stu 
loop 
dbms_output.PUT_LINE(stu.stuno||'->'||stu.stuname); 
--循环做隐含检查 %notfound 
end loop; 
--自动关闭游标 
end; 
END PROC_STU3; 

proc_1:
create or replace procedure proc_1 as
BEGIN
DECLARE
     emp_id employees.employee_id%type;
      CURSOR cur IS
        SELECT b.employee_id, b.ROWID ROW_ID
          FROM employees b
        ORDER BY b.ROWID;
    BEGIN
      FOR row IN cur LOOP
        DBMS_OUTPUT.PUT_LINE('last name: '||row.employee_id||'--'||row.ROW_ID);
     END LOOP;
   END;
end proc_1;


proc_2:

create or replace procedure proc_2 as
BEGIN
 declare
    cursor emp_cursor is select ename,sal from emp where deptno=10;--定义游标,指定游标所对应的

    v_ename emp.ename%type; ---定义接收游标数据的变量
    v_sal emp.sal%type;     ---定义接收游标数据的变量
    begin
    open emp_cursor;        ----打开游标
   loop                    ---取多条数据,循环题
    fetch emp_cursor into v_ename,v_sal; ----提取数据
    exit when emp_cursor%notfound;      -----当没去取到数据的时候退出
   dbms_output.put_line(v_ename||': '||v_sal);
   end loop;   ----退出
   close emp_cursor;  ----关闭
   end;
   end proc_2;


那么不关闭游标有什么影响呢?

按oracle文档的要求和编写数据库代码的好的习惯, 绝对要对一个已经用完的游标关闭掉, 如果不想写这些语句你可以用for loop游标的方法!
用完就得关闭,否则就会占用资源。
SESSION关闭的时候游标会自动释放。



循环外关闭cursor:
create or replace procedure proc_100 as
BEGIN
 declare
    cursor emp_cursor is select ename,sal from emp where deptno=10;
    v_ename emp.ename%type; 
    v_sal emp.sal%type; 
    begin
    open emp_cursor;  
loop
    fetch emp_cursor into v_ename,v_sal; 
  exit when emp_cursor%notfound;      
 dbms_output.put_line(v_ename||': '||v_sal);
  close emp_cursor;
   end loop; 
   close emp_cursor;
   end;
   end proc_100;

可以

SQL> create or replace procedure proc_100 as
BEGIN
 declare
    cursor emp_cursor is select ename,sal from emp where deptno=10;
    v_ename emp.ename%type; 
    v_sal emp.sal%type; 
    begin
    open emp_cursor;  
loop
    fetch emp_cursor into v_ename,v_sal; 
  exit when emp_cursor%notfound;      
 dbms_output.put_line(v_ename||': '||v_sal);
  close emp_cursor;
   end loop; 
   close emp_cursor;
   end;
    close emp_cursor;
   end proc_100;  2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18  
 19  /

Warning: Procedure created with compilation errors.

SQL> show err
Errors for PROCEDURE PROC_100:

LINE/COL ERROR
-------- -----------------------------------------------------------------
17/5	 PL/SQL: SQL Statement ignored
17/11	 PLS-00201: identifier 'EMP_CURSOR' must be declared

报错 关闭游标有,必须重新定义




posted @ 2014-01-26 18:45  czcb  阅读(534)  评论(0)    收藏  举报