• Cursor--游标


    游标--cursor['kɜːsə]

      概念:

                            在执行SQL语句时,Oracle服务器将分配一个内存区域,不仅存储这个语句,还存储语句的结果 — 称为游标
      

     隐式游标
        DML语句或值返回一行结果的select语句时,Oracle服务器将创建一个隐式游标。
            隐式游标是自动的。

     
     显示游标
        select返回多行结果时,就必须创建一个显示游标   -   bulk collect 
        必须手工声明、打开和关闭
     
                cursor cursor_name is sql(sql指,sql语句)
     
          1.在进行任何处理前,必须首先打开游标:
             ---打开显示游标
                 分配必要内存,执行select子句检索的数据加载到游标中
                 open cursor_name;
                 打开游标后,可以将游标中包含的数据赋给变量以进行处理
            
          2.从游标中提取数据:
             ----使用fetch命令来提取游标中的数据
                 fetch命令提取数据后将值赋给变量
     
                fetch cursor_name into [v_name1,v_name2,………];
     
                   %ROWCOUNT
                          -----处理的行数(DML执行后影响的行数)
                                   sql%rowcount
                              cursor_name%rowcount
                     %FOUND
                              ----- 查找到了行
                    %NOTFOUND
                               ------ 没查找到行
                    sql%notfound
                              ------- cursor_name%notfound
                    %ISOPEN
                              ------ 游标是否打开
     
     
          3.关闭游标
                 必须明确关闭
                 在可执行部分使用close命令
                 close cursor_name;
     
    实例一:
    1. declare
    2. v_no employee.empno%type;
    3. v_name employee.name%type;
    4. v_sal employee.salary%type;
    5. cursor emp_cursor isselect empno , name , salary
    6. from employee
    7. where empno ='0001';
    8. begin
    9. open emp_cursor;
    10. loop
    11. fetch emp_cursor into v_no,v_name,v_sal;
    12. exitwhen emp_cursor%notfound;
    13. dbms_output.put_line('编号'||v_no||'员工'||v_name||'的工资是'||v_sal);
    14. end loop;
    15. close emp_cursor;
    16. end;
     
     
    游标for循环
                  (自动open游标)
                         For name in cursorName loop  
                            ...  (处理sql语句)
                         end loop;
                (自动close游标)
    实例二:
    1. declare
    2. cursor emps_cursor isselect*from employee order by empno;
    3. v_emp employee%rowtype;
    4. begin
    5. for v_emp in emps_cursor loop
    6. dbms_output.put_line('编号'||v_emp.empno||' 的员工: '||v_emp.name||' 的工资是 : '||v_emp.salary);
    7. end loop;
    8. end;
     
    显式游标中:
          cursor_name%rowcount       -----游标推进行数
          cursor_name%found             -----fectch有没有找到找到一行
          cursor_name%notfound       -----fetch没有找到一行
    ps:每fetch一次,游标自动推进一行
               %rowtype表示某个表的类型,类似某个表的一行,用来存放表中一行的数据
               游标能再次打开
     
    实例三:
    1. declare
    2. cursor em_cursor isselect*from employee order by salary desc;
    3. v_emp employee%rowtype;
    4. begin
    5. open em_cursor;
    6. fetch em_cursor into v_emp;
    7. while em_cursor%rowcount<=5and em_cursor%found loop
    8. dbms_output.put_line(em_cursor%rowcount||''||v_emp.name||':'||v_emp.salary);
    9. fetch em_cursor into v_emp;
    10. end loop;
    11. close em_cursor;
    12. end;
     
    课程作业:
    1. --查询所有学生及其专业信息-显示游标
    2. declare
    3. cursor stuMajors isselect s.stuNo, s.name, s.JavaSEScore, s.score, m.name as majorName
    4. from student s, major m
    5. where s.majorNo = m.majorNo;
    6. --定义变量查询列一致
    7. v_stuNo student.stuNo%type;
    8. v_name student.name%type;
    9. v_seScore student.javasescore%type;
    10. v_sumscore student.score%type;
    11. v_majorName major.name%type;
    12. --记录
    13. type stumr is record(v_stuNo student.stuNo%type, v_name student.name%type,
    14. v_seScore student.javasescore%type, v_sumscore student.score%type,
    15. v_majorName major.name%type);
    16. stum stumr;
    17. begin
    18. open stuMajors;
    19. -- fetch stuMajors into stum;-- fetch 游标中查询的列应与变量记录中列保持一致
    20. -- dbms_output.put_line(stum.v_name);
    21. -- fetch stumajors into v_stuNo, v_name, v_seScore, v_sumscore, v_majorName;
    22. -- dbms_output.put_line(v_name || v_majorName);
    23. loop
    24. fetch stuMajors into stum;
    25. dbms_output.put_line(stum.v_stuNo ||' '|| stum.v_name ||' '|| stum.v_seScore ||' '||
    26. stum.v_sumScore ||' '|| stum.v_majorName );
    27. -- dbms_output.put_line(stuMajors%rowCount);
    28. exitwhen stuMajors%notFound;
    29. end loop;
    30. close stuMajors;
    31. --游标for循环
    32. end;
     
             
     
     





  • 相关阅读:
    存储过程分页,前台应用范例repeater分页
    引用真正分页控件(与存储过程联合使用)页面
    分页存储过程repeater分页
    查找DetailsView1数据控件中的数据
    c#读取文件
    SQL触发器实例讲解
    TreeView节点选中问题
    C# 实现版本自动更新
    .Net那点事儿系列:C#操作Xml:通过XmlDocument读写Xml文档
    Linq学习笔记
  • 原文地址:https://www.cnblogs.com/jarl/p/5892890.html
Copyright © 2020-2023  润新知