• 关闭游标


    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
    
    报错 关闭游标有,必须重新定义
    
    
    
    

  • 相关阅读:
    C艹老师布置的思考题
    计蒜客练习题:网页跳转(java / C++仔细)
    计蒜客练习题:水果店(嵌套map)
    计蒜客练习题:蒜头君面试(map + max_element)
    小希的迷宫 HDU 1272(并查集)
    OpenJ_Bailian 1061
    Aizu 2224(并查集)
    Aizu 0189 (最短路)
    POJ 2377(最大生成树)
    OpenJ_Bailian 4118(dp)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13352428.html
Copyright © 2020-2023  润新知